Effective java中對於Lambda的建議

1.Lambda優先於匿名類

       Lambda類似於匿名類的函數,但是更加簡潔。
       使用Lambda的時候,儘量刪除所有Lambda參數的類型,除非它們存在能夠讓程序變得更加清晰
但是如果一個計算不是自描述的,或者超過了幾行,那就不要把他放在一個Lambda中。一行最理想,三行是合理的最大極限。
       千萬不要給函數對象使用匿名類,除非必須創建非函數接口的類型的實例。

2.方法引用優先於Lambda

方法應用類型 範例 Lambda等式
靜態         Integer::parseInt         str -> Integer.parseInt(str)
有限制         Instant.now()::isAfter         Instance then = Instant.now();t ->then.isAfter(t)
無限制         String::toLowerCase         str->str.toLowerCase()
類構造器         TreeMap<K,V>::now         ()->new TreeMap<.k,v>
數組構造器         int[]::new         len->new int[len]
只要方法引用更加簡潔,清晰,就用方法引用,如果方法引用並不簡潔,就堅持使用Lambda

3.堅持使用標準的函數接口

       只要標準的函數接口能夠滿足需求,通常應該優先考慮,而不是專門構建一個新的函數接口。
       基礎接口作用於對象引用類型。
Operator接口代表其結果與參數類型一致的函數
Predicate接口代表帶有一個參數並但會一個boolean的函數
Function接口代表其參數與返回的類型不一致的函數
Supplier接口代表沒有參數並且返回一個值的函數。
Consumer代表的是帶有一個函數但不返回任何值的函數
       他們各自還有3種變體,分別可以作用於int,long,double
       千萬不要使用帶包裝類型的基礎函數接口代替基本函數接口

 4.謹慎使用stream

       在沒有顯式類型的情況下,仔細命名Lambda參數,這對於Stream pipeline的可讀性重要
       最好避免利用Stream來處理char值
       如果實在不確定用stream還是用迭代好,就兩種都試試,看看那種更好用。

5.優先選擇Stream中無副作用的函數

       forEach操作應該只用於報告Stream計算的結果,而不是執行計算。
       最重要的收集器工廠是toList,toSet,toMap,groupingBy 和joining

6.Stream要優先用collection作爲返回類型

       Collection接口是Iterable的一個子類型,它有一個Stream方法,因此提供了迭代和Stream訪問,對於公共的,返回序列的方法,Colleciton或者適當的子類型通常是最佳的返回類型,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章