本節將重點探討複合Lambda表達式的使用。在閱讀本篇以前建議您先閱讀:java
java8實戰讀書筆記:Lambda表達式語法與函數式編程接口,由於本篇是上篇的補充。編程
本書爲博主在學習《java8實戰》時的筆記。微信
比較器複合app
上面是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定義了以下靜態方法:函數式編程
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>函數式編程接口,其類圖以下所示:
舒適提示: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,其類圖以下:
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))。
更多文章請關注微信公衆號:
一波廣告來襲,做者新書《RocketMQ技術內幕》已出版上市:
《RocketMQ技術內幕》已出版上市,目前可在主流購物平臺(京東、天貓等)購買,本書從源碼角度深度分析了RocketMQ NameServer、消息發送、消息存儲、消息消費、消息過濾、主從同步HA、事務消息;在實戰篇重點介紹了RocketMQ運維管理界面與當前支持的39個運維命令;並在附錄部分羅列了RocketMQ幾乎全部的配置參數。本書獲得了RocketMQ創始人、阿里巴巴Messaging開源技術負責人、Linux OpenMessaging 主席的高度承認並做序推薦。目前是國內第一本成體系剖析RocketMQ的書籍。