函數式接口java.util.function


  1. 什么是函數式接口
  2. 為什么要用函數式接口
  3. java.util.function和其他的函數式接口
  4. lamdba表達式
  5. 方法引用
  6. 流 Stream

1 什么是函數式接口

  用@FunctionInterface注解的接口是函數式接口,那么不用@FunctionInterface注解的接口是不是函數式接口?什么接口能用@FunctionInterface注解呢?

  函數式接口滿足一個條件,只有一個抽象方法。在JDK的API中的,只有一個抽象方法的接口可以用@FunctionInterface注解。

2 為什么要用函數式接口

  答案是為了行為參數化:行為參數化是為了讓你處理頻繁變更需求的一種軟件開發模式,將變化的代碼塊抽離成一個行為,當做一個參數隔離出來。在開閉原則上,將容易變化的行為隔離出來,面向對象會要求你將隔離出來的行為進行抽象。

  函數式接口即為這部分抽象,將變化抽象出來。為什么函數式接口只允許有一個抽象方法存在呢,為了使用lambda表達式。

3 java.util.function和其他的函數式接口

  其他的函數式接口Runnable,Callable,Comparator以及java.util.function包下的Function,Predicate,Supplier,Consumer

  3.1 java.util.function.Predicate

  Predicate<T> 中只有一個抽象方法--boolean test(T t);

  3.2 java.util.function.Consumer

  Consumer<T>中有一個抽象方法 void accept(T t);接受一個泛型對象,返回一個空,消費此對象。

  3.3 java.util.function.Function

  Function<T,R>中有一個抽象方法 R  apply (T t);接受一個T對象,轉換為一個R對象。Stream的map即為詞原理,public static <T,R> List<R> map(List<T> list,Function<T,R> f),

這兒在使用此map方法的時候,lambda表達式是實現函數式接口Function<T,R>的apply方法,默認將T對象轉換為R對象,Stream的泛型value在apply得到了fill。

  3.4 java.util.function.Supplier

  Supplier<T> 接口中有一個抽象方法  T get(); 參數為空,返回一個T對象,生產者。

4 lamdba表達式

  在所有指定方法參數為行為參數化的函數式接口中,都可以使用lamdba的方式進行調用   (函數式接口中唯一抽象方法的參數) -> {此抽象方法的實現},如果是一行代碼可以去掉大括號

5 方法引用

  6.1 構造方法調用

  6.2靜態方法的調用

  6.3實例方法的調用

6 流 Stream

  “集合談的是數據,流講的是計算”

   流的操作:篩選、切片、映射、查找、匹配和歸約


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM