1. 程式人生 > >Java8新特性——內建的功能性介面

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. }