java8實戰讀書筆記:複合Lambda表達式

本節將重點探討複合Lambda表達式的使用。在閱讀本篇以前建議您先閱讀:java

java8實戰讀書筆記:Lambda表達式語法與函數式編程接口,由於本篇是上篇的補充。編程

本書爲博主在學習《java8實戰》時的筆記。微信

比較器複合app

java8實戰讀書筆記:複合Lambda表達式

上面是JDK8中java.util.Comparator接口,相比jdk1.7增長了好多方法,也許你會以爲奇怪,爲何接口中還能定義方法,緣由是JDK8中,能夠爲接口添加默認實現,使用default關鍵字定義。
咱們能夠這樣定義一個比較器:運維

1Comparator< Apple>  c = Comparator.comparing(Apple::getWeight());

其等價爲:ide

1Comparator< Apple>  c = Comparator.comparing(  (a) -> a.getWeight()  );

爲何能夠這樣寫呢?由於Comparator定義了以下靜態方法:函數式編程

java8實戰讀書筆記:複合Lambda表達式

逆序

Comparator定義了一個靜態方法,reversed,故咱們不須要從新再定義一個比較器,咱們能夠這樣就能實現逆序排序:函數

1List< Apple> apples = new ArrayList<>();
2apples.sort(  Comparator.comparing(Apple::getWeight()).reversed()  );

比較器鏈

若是要支持多重排序呢?例如先根據蘋果的重量,若是重量相同就按照顏色排序,那如何來實現呢?學習

1apples.sort(  Comparator.comparing(Apple::getWeight()).thenComparing(  Apple::getColor()  ) );

之因此可使用上述表達式,是由於Comparator定義了以下方法:3d

1default <U extends Comparable<? super U>> Comparator<T> thenComparing( Function<? super T, ? extends U> keyExtractor)
2{
3    return thenComparing(comparing(keyExtractor));
4}

舒適提示:Comparator中定義不少thenComparing重載方法,在具體使用過程當中,能夠先看看其函數聲明。

謂詞複合

提到謂詞複合,咱們就不得不提Predicate<T>函數式編程接口,其類圖以下所示:
java8實戰讀書筆記:複合Lambda表達式

  • and:與
  • negate:非
  • or:或

舒適提示:and 和 or 是按照在表達式鏈中的位置,從左向右肯定優先級的。所以, a.or(b).and(c) 能夠看做 (a || b) && c 。

使用示例:從蘋果列表中找出全部紅色的,而且重量超過150的蘋果:

1apples.filter((a -> "red".equals(a.getColor())).and(  a -> a.getWeight() > 150 ));

2a -> "red".equals(a.getColor())  是 (Apple a ) -> "red".equals(a.getColor())的簡寫。

函數複合

函數複合,其對應的函數式編程接口爲Function,其類圖以下:

java8實戰讀書筆記:複合Lambda表達式

  • addThen
    andThen 方法會返回一個函數,它先對輸入應用一個給定函數,再對輸出應用另外一個函數。
    例如:
    Function f = x -> x + 1;
    Function g = x -> x * 2;
    Function h = f.andThen(g);
    int result = h.apply(1); // 其結果返回4,相似與數學公式 f(g(x))。

  • compose
    先把給定的函數用做 compose 的參數裏面給的那個函數,而後再把函數自己用於結果。與addThen的函數應用方向相反,一樣舉例說明以下:
    Function f = x -> x + 1;
    Function g = x -> x * 2;
    Function h = f.compose(g);
    int result = h.apply(1); // 其結果返回3,相似與數學公式 g(f(x))。

更多文章請關注微信公衆號:
java8實戰讀書筆記:複合Lambda表達式

一波廣告來襲,做者新書《RocketMQ技術內幕》已出版上市:
java8實戰讀書筆記:複合Lambda表達式

《RocketMQ技術內幕》已出版上市,目前可在主流購物平臺(京東、天貓等)購買,本書從源碼角度深度分析了RocketMQ NameServer、消息發送、消息存儲、消息消費、消息過濾、主從同步HA、事務消息;在實戰篇重點介紹了RocketMQ運維管理界面與當前支持的39個運維命令;並在附錄部分羅列了RocketMQ幾乎全部的配置參數。本書獲得了RocketMQ創始人、阿里巴巴Messaging開源技術負責人、Linux OpenMessaging 主席的高度承認並做序推薦。目前是國內第一本成體系剖析RocketMQ的書籍。

相關文章
相關標籤/搜索