日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Java 8 - 07 复合 Lambda 表达式

發布時間:2025/3/21 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 。

enginnerList.sort(comparing(Enginner::getJob).reversed() // 倒敘.thenComparing(Enginner::getAge)); // 職位相同時, 進一步按年齡排序

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); // 這將返回4

compose

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 表达式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。