JDK 1.8 API中包含了很多内置的函数式接口。有些是在以前版本的Java中大家耳熟能详的,例如Comparator接口,或者Runnable接口。对这些现成的接口进行实现,可以通过@FunctionalInterface 标注来启用Lambda功能支持。 

此外,Java 8 API 还提供了很多新的函数式接口,来降低程序员的工作负担。有些新的接口已经在Google Guava库中很有名了。如果你对这些库很熟的话,你甚至闭上眼睛都能够想到,这些接口在类库的实现过程中起了多么大的作用。 

Predicates 

Predicate是一个布尔类型的函数,该函数只有一个输入参数。Predicate接口包含了多种默认方法,用于处理复杂的逻辑动词(and, or,negate): 

Java代码 
  1. Predicate<String> predicate = (s) -> s.length() > 0;  
  2.    
  3. predicate.test("foo");              // true  
  4. predicate.negate().test("foo");     // false  
  5.    
  6. Predicate<Boolean> nonNull = Objects::nonNull;  
  7. Predicate<Boolean> isNull = Objects::isNull;  
  8.    
  9. Predicate<String> isEmpty = String::isEmpty;  
  10. Predicate<String> isNotEmpty = isEmpty.negate();  

Functions 

Function接口接收一个参数,并返回单一的结果。默认方法可以将多个函数串在一起(compse, andThen): 

Java代码 
  1. Function<String, Integer> toInteger = Integer::valueOf;  
  2. Function<String, String> backToString = toInteger.andThen(String::valueOf);  
  3.    
  4. backToString.apply("123");     // "123"  

Suppliers 

Supplier接口产生一个给定类型的结果。与Function不同的是,Supplier没有输入参数。 

Java代码 
  1. Supplier<Person> personSupplier = Person::new;  
  2. personSupplier.get();   // new Person  

Consumers 

Consumer代表了在一个输入参数上需要进行的操作。 

Java代码 
  1. Consumer<Person> greeter = (p) -> System.out.println("Hello, " + p.firstName);  
  2. greeter.accept(new Person("Luke""Skywalker"));  

Comparators 

Comparator接口在早期的Java版本中非常著名。Java 8 为这个接口添加了不同的默认方法。 

Java代码 
  1. Comparator<Person> comparator = (p1, p2) -> p1.firstName.compareTo(p2.firstName);  
  2.    
  3. Person p1 = new Person("John""Doe");  
  4. Person p2 = new Person("Alice""Wonderland");  
  5.    
  6. comparator.compare(p1, p2);             // > 0  
  7. comparator.reversed().compare(p1, p2);  // < 0  

Optionals 

Optional不是一个函数式接口,而是一个精巧的工具接口,用来防止NullPointerEception产生。这个概念在下一节会显得很重要,所以我们在这里快速地浏览一下Optional的工作原理。 

Optional是一个简单的值容器,这个值可以是null,也可以是non-null。考虑到一个方法可能会返回一个non-null的值,也可能返回一个空值。为了不直接返回null,我们在Java 8中就返回一个Optional。 

Java代码 
  1. Optional<String> optional = Optional.of("bam");  
  2.    
  3. optional.isPresent();           // true  
  4. optional.get();                 // "bam"  
  5. optional.orElse("fallback");    // "bam"  
  6.    
  7. optional.ifPresent((s) -> System.out.println(s.charAt(0)));     // "b"