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