函数式接口
JDK 1.8 API 中包含了很多内置的函数式接口。有些是在以前版本的Java中大家耳熟能详的,例如Comparator
接口,或者Runnable接口。对这些现成的接口进行实现,可以通过@FunctionalInterface
标注来启用Lambda功能支持。
Functions
Function接口接收一个参数,并返回单一的结果。默认方法可以将多个函数串在一起(compse, andThen)
Function<String, Integer> toInteger = Integer::valueOf;
System.out.println(toInteger.apply("5"));
Function<Integer, Integer> myFunction = (i) -> {
return i;
};
System.out.println(myFunction.apply(100));
Predicates
Predicate是一个布尔类型的函数,该函数只有一个输入参数。Predicate接口包含了多种默认方法,用于处理复杂的逻辑动词(and, or,negate)
Predicate<Person> personPredicate = person -> person.getAge() == 0;
System.out.println(personPredicate.test(new Person(25, "LinQin2")));
Suppliers
Supplier接口产生一个给定类型的结果。与Function不同的是,Supplier没有输入参数。
// 无参数 返回一个对象
Supplier supplier = () -> "value";
System.out.println(supplier.get());
Consumers
Consumer代表了在一个输入参数上需要进行的操作。
// 一个参数对象 void
Consumer<Person> consumer = person -> System.out.println(person.getAge());
consumer.accept(new Person(25, "LinQin"));
Comparators
// compare接口
Comparator<Person> personComparator = (o1, o2) -> o1.getName().compareTo(o2.getName());
// 输出 1
System.out.println(personComparator.compare(new Person(25, "LinQin2"), new Person(25, "LinQin1")));
Optional
Optional不是一个函数式接口,而是一个精巧的工具接口,用来防止 NullPointerException 产生。针对 Mybatis 的Mapper 也是支持返回类型为 Optional 封装的对象、集合,可以直接使用这个进行封装。
// option 针对对象多个判空可以预先使用 Optional 进行判空
Person person = new Person(25, null);
String str = Optional.ofNullable(person)
.map(p -> p.getName())
.map(name -> name.toLowerCase())
.orElse("null");
System.out.println(str); // 打印 null, 不会报NPE