- 什么是函數式接口
- 為什么要用函數式接口
- java.util.function和其他的函數式接口
- lamdba表達式
- 方法引用
- 流 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
“集合談的是數據,流講的是計算”
流的操作:篩選、切片、映射、查找、匹配和歸約