Java 8 - 07 复合 Lambda 表达式
文章目錄
- Pre
- Comparator 比較器復合
- 逆序 reversed()
- 比較器鏈 thenComparing
- Predicate 謂詞復合
- negate
- and / or
- Function 函數復合
- andThen
- compose
Pre
前面幾個我們使用lambda表達式,都用的是默認的抽象方法,還記得不?
事實上,許多函數式接口,比如用于傳遞Lambda表達式的 Comparator 、 Function 和 Predicate 都提供了允許你進行復合的方法
這些函數接口中的其他方法(default方法或者static方法) 有啥用呢?
在實際使用場景中,可以把多個簡單的Lambda復合成復雜的表達式。 比如 可以讓兩個謂詞之間做一個 or 操作,組合成一個更大的謂詞,還可以讓一個函數的結果成為另一個函數的輸入等等
接下來我們挑幾個函數式接口來實戰一下
Comparator 比較器復合
是不是懵了,這么多default 和 static方法 。。。
不急,一點點看
Java 8 - Lambda 和方法引用實戰 中推導了一個表達式如下
enginnerList.sort(comparing(Enginner::getJob));逆序 reversed()
對enginnerList進行排序,比較工程師的職位 , 這個時候如果想倒敘排列呢?
用不著去建立另一個 Comparator 的實例。接口有一個默認方法 reversed 可以使給定的比較器逆序。因此仍然用開始的那個比較器,只要修改一下前一個例子就可以對Enginner按職位遞減排序:
enginnerList.sort(comparing(Enginner::getJob).reversed());比較器鏈 thenComparing
如果發現有兩個Engineer的職位一樣 怎么辦?哪個Engineer應該排在前面呢?你可能
需要再提供一個 Comparator 來進一步定義這個比較,比如再按年齡排序。 thenComparing 方法就是做這個用的。它接受一個函數作為參數(就像 comparing 方法一樣),如果兩個對象用第一個 Comparator 比較之后是一樣的,就提供第二個 Comparator 。
Predicate 謂詞復合
謂詞接口包括三個方法: negate 、 and 和 or ,讓你可以重用已有的 Predicate 來創建更復雜的謂詞。
negate
比如,我們可以使用 negate 方法來返回一個 Predicate 的非 。
例如 不是Java工程師
// 產生現有 Predicate 對象 redApple 的非Predicate<Apple> notRedApple = redApple.negate();and / or
還可能想要把兩個Lambda用 and 方法組合起來,比如一個蘋果既是紅色又比較重:
// 鏈接兩個謂詞來生成另 一個 Predicate 對象Predicate<Apple> redAndHeavyApple = redApple.and(a -> a.getWeight() > 150);可以進一步組合謂詞,表達要么是重(150克以上)的紅蘋果,要么是綠蘋果
// 鏈接 Predicate 的 方法來構造更復雜 Predicate 對象Predicate<Apple> redAndHeavyAppleOrGreen = redApple.and(a -> a.getWeight() > 150) .or(a -> "green".equals(a.getColor()));請注意, and 和 or 方法是按照在表達式鏈中的位置,從左向右確定優先級的。因此, a.or(b).and? 可以看作 (a || b) && c 。
Function 函數復合
還可以把 Function 接口所代表的Lambda表達式復合起來。 Function 接口為此配了 andThen 和 compose 兩個默認方法,它們都會返回 Function 的一個實例
andThen
andThen 方法會返回一個函數,它先對輸入應用一個給定函數,再對輸出應用另一個函數。
Function<Integer, Integer> f = x -> x + 1; Function<Integer, Integer> g = x -> x * 2; Function<Integer, Integer> h = f.andThen(g); // 數學上會寫作 g(f(x)) 或 (g o f)(x) int result = h.apply(1); // 這將返回4compose
compose 方法,先把給定的函數用作 compose 的參數里面給的那個函數,然后再把函數本身用于結果。
比如在上一個例子里用 compose 的話,它將意味著 f(g(x)) ,而 andThen 則意味著 g(f(x)) :
Function<Integer, Integer> f = x -> x + 1; Function<Integer, Integer> g = x -> x * 2; Function<Integer, Integer> h = f.compose(g); // 數學上會寫作 f(g(x)) 或 (f o g)(x) int result = h.apply(1); // 這將返回3總結
以上是生活随笔為你收集整理的Java 8 - 07 复合 Lambda 表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 8 - 06 Lambda 和
- 下一篇: Java - 死锁 Dead Lock