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