1.概念
Lambda是一個匿名函數,可以將其理解爲一段可以傳遞的代碼(將代碼像數據一樣進行傳遞)可以寫出更簡潔、更靈活的代碼。作爲一種更緊湊的代碼風格,使得java語言的表達能利得到了提升。
2. Lambda表達式的基礎語法
java8中引用了一個新的操作符"->",該操作符稱爲箭頭操作符或者Lambda操作符,箭頭操作符將Lambda表達式分爲了兩部分:
-
左邊:Lambda表達式的參數列表
-
右邊:Lambda表達式中,所需要執行的功能,即 Lambda體
語法格式一:無參數,無返回值的方法() -> Lambda體
如: () -> System.out.println("hello");
語法格式二:有一個參數,並且無返回值(參數1) -> Lambda體
如: (x) -> System.out.println("hehe");
語法格式三:若只有一個參數小括號可以省略不寫參數1-> Lambda體
如: x -> System.out.println("hehe");
語法格式四:有兩個以上的參數,有返回值,並且Lambda體中有多條語句(參數1,參數2) -> {語句體1;語句體2};
如:
Comparator com -> (x,y) -> { System.out.println("函數式接口"); return Integer.compare(x,y); }
語法格式五:若Lambda體中只有一條語句,return和大括號都可以不寫(參數1,參數2) -> 語句體1;
如:Comparator com = (x,y) -> Integer.compare(x,y);
語法格式六:Lambda表達式的參數列表的數據類型可以省略不寫,因爲JVM編譯器通過上下文推斷出數據類型即“類型推斷”
如: (Integer x, Integer y) -> Integer.compare(x,y);
3. Lambda表達式需要“函數式接口”的支持
函數式接口:接口中只有一個抽象方法的藉口,稱爲函數式接口,可以使用註解** @FunctionInterface **修飾,可以檢查是否是函數式接口
4. java8中內置的四大核心函數式接口
Consumer<T> : 消費型接口 void accept(T t);
Supplier<T> : 供給型接口
T get();
Function<T, R> : 函數型接口
R apply(T t);
Predicate<T> : 斷言型接口 boolean test(T t);
5. 方法引用
概念:若Lambda 體中的內容有方法已經實現了,我們可以使用“方法引用”(可以理解爲“方法引用”是Lambda表達式的另外一種表現形式)
主要有三種語法格式:
- 對象::實例方法名
- 類::靜態方法名
- 類::實例方法名
注意:
- Lambda體中調用方法的參數列表與返回值類型,要與函數式接口中抽象方法的函數列表和返回值保持一致;
- 若 Lambda 參數列表中的第一個參數是實例方法的調用者,而第二個參數是實例方法的參數時,可以使用ClassName :: method (類::實例方法名)
6. 構造器引用
格式:ClassName::new
注意:
- 需要調用的構造器的參數列表要與函數式接口中抽象方法的參數列表保持一致
7. 數組引用
格式:Type[]::new;
Optional類
<1> 概念
Optional是一個容器類,代表一個值存在或不存在,原來用null表示值不存在,現在Optional可以更好的表達這個概念。並且可以避免空指針異常
<2> Optional容器類的常用方法
-
Optional.of(T t):創建一個Optional實例
-
Optional.empty():創建一個空的Optional實例
-
Optional.ofNullable(T t):若t不爲null,創建一個Optional實例,否則創建空實例
注意:
of方法不能構建null,會報出空指針異常
empty只是構建一個空的Optional
ofNullable傳入對象就構建對象,傳入null就構建一個空的Optional
isPresent():判斷是否包含值
orElse(T t):如果調用對象包含值,返回該值,否則返回t
orElseGet(Supplier s):如果調用對象包含值,返回該值 否則返回s獲取的值
map(Function f):如果有值對其處理,並返回處理後的Optional,否則返回Optional.empty()
flatMap(Function mapper):與map類似,要求返回值必須是Optional
原文參見公衆號【Java知音】