Java8新特性——内建的功能性接口

转载自:http://blog.csdn.net/gdouchufu/article/details/29235975,由于是转载,就什么也不改了.谢谢博主分享!

今天是高考的日子,是大四师兄师姐答辩毕业的日子。一代又来,一代又去。好久没写博客,借此特殊日子整理一下前不久学java8新特性时写的代码,留下痕迹。(本博客的代码根据 java8新特性教程 学习整理,加上个人的理解而成,关于某个新特性的介绍代码里的注释已经阐述清楚,故不再写文字介绍,直接看代码吧!)


    本篇介绍java8的新特性之一:内建的功能性接口。    

这些常用的内建功能性接口包括:断言接口(Predicates)、功能接口(Functions)、供应接口(Suppliers)、消费接口(Consumers)、比较接口(Comparators)、选项接口(Optionals)。


1. 先定义一个JavaBean以作测试用:

[java]  view plain  copy
  1. public class Person {    
  2.     public String firstName;    
  3.     public String lastName;    
  4.     
  5.     public Person() {}    
  6.     
  7.     public Person(String firstName, String lastName) {    
  8.         this.firstName = firstName;    
  9.         this.lastName = lastName;    
  10.     }    
  11. }   

2. 测试各个接口的作用:

[java]  view plain  copy
  1. import java.util.Comparator;  
  2. import java.util.Optional;  
  3. import java.util.function.Consumer;  
  4. import java.util.function.Function;  
  5. import java.util.function.Predicate;  
  6. import java.util.function.Supplier;  
  7.   
  8. import org.junit.Test;  
  9.   
  10. /** 
  11.  * 内建的功能性接口 
  12.  *  
  13.  * Java8的API也包含了很多新的功能性接口简化你的开发。 
  14.  * 一些新的接口是来自非常出名的Google Guava库。 
  15.  */  
  16. public class InternalFunctionalInterface {  
  17.       
  18.     /** 
  19.      * 断言接口(Predicates) 
  20.      * Predicates是只拥有一个参数的Boolean型功能的接口。这个接口拥有多个默认方法用于构成predicates复杂的逻辑术语。 
  21.      */  
  22.     @Test  
  23.     public void Predicates(){  
  24.               
  25.         Predicate<String> predicates = (str) -> str.length()>0;       
  26.         boolean b1 = predicates.test("foo"); //true  
  27.         System.err.println(b1);       
  28.         b1 = predicates.negate().test("foo"); //false ,取反  
  29.         System.err.println(b1);  
  30.           
  31.         Predicate<String> isEmpty = String::isEmpty;  
  32.         Predicate<String> isNotEmpty = isEmpty.negate();  
  33.           
  34.         System.err.println(isEmpty.test("sfasdfsa")); //false  
  35.         System.err.println(isNotEmpty.test("sfasdfsa")); //true  
  36.           
  37.     }  
  38.       
  39.    /** 
  40.     * 功能接口(Functions) 
  41.     * Functions接受一个参数并产生一个结果。默认方法能够用于将多个函数链接在一起。 
  42.     */  
  43.     @Test  
  44.     public void Function(){  
  45.         Function<String, Integer> toInteger = Integer::valueOf;//(str) -> Integer.valueOf(str);  
  46.         Function<String, String> backToString = toInteger.andThen(String::valueOf);  
  47.           
  48.         System.err.println(backToString.apply("123")); // "123"  
  49.     }  
  50.       
  51.     /** 
  52.      * 供应接口(Suppliers) 
  53.      * Suppliers对于给定的泛型类型产生一个实例。不同于Functions,Suppliers不需要任何参数。 
  54.      */  
  55.     @Test  
  56.     public void Supplier(){  
  57.         Supplier<Person> supplier = Person::new;  
  58.         Person p =  supplier.get();  
  59.         System.err.println(p);        
  60.     }  
  61.       
  62.     /** 
  63.      * 消费接口(Consumers) 
  64.         Consumers代表在只有一个输入参数时操作被如何执行。 
  65.      */  
  66.     @Test  
  67.     public void Consumers(){  
  68.         Consumer<Person> greeter = (p) -> System.err.println("Hello, "+p.firstName);  
  69.         greeter.accept(new Person("Lee","xx"));  
  70.     }  
  71.       
  72.     /** 
  73.      * 比较接口(Comparators) 
  74.         Comparators在老版本中就已经被熟知。Java8向该接口中添加了多种默认方法。 
  75.      */  
  76.     @Test  
  77.     public void Comparator(){  
  78.         Comparator<Person> comparator = (p1,p2) -> p1.firstName.compareTo(p2.firstName);  
  79.           
  80.         Person p1 = new Person("Lee","bugua");  
  81.         Person p2 = new Person("Chen","yueyayun");  
  82.           
  83.         System.err.println(comparator.compare(p1, p2)); // 9>0       why is 9????????????????????  
  84.         System.err.println(comparator.reversed().compare(p1, p2));; // -9<0   
  85.     }  
  86.       
  87.     /** 
  88.      * 选项接口(Optionals) 
  89.         Optionals并不是功能性接口,反而它是一种特殊的工具用来阻止NullPointerException。 
  90.         我们首先快速的浏览Optionals是如何工作的,因为它在下一章节是十分重要的概念。 
  91.         Optional是一种可以包含null和non-null值的简单容器。考虑到方法可以返回non-null结果,偶尔也可能任何都不返回。 
  92.         在Java8中,你可以返回Optional而不是返回null。 
  93.      */  
  94.     @Test public void Optionals(){  
  95.         Optional<String> optional = Optional.of("bam"); //不能为空  
  96.           
  97.         System.err.println(optional.isPresent()); // true  
  98.         System.err.println(optional.get()); // "bam"  
  99.         System.err.println(optional.orElse("fallback"));  
  100.           
  101.         optional.ifPresent( (s) -> System.err.println(s+"----------"));  
  102.           
  103.     }  
  104. }

猜你喜欢

转载自blog.csdn.net/SkydivingWang/article/details/77412978