最近把《Java8 Lambda》這本書翻完了,就總結(jié)一下印象比較深刻的細(xì)節(jié)吧沙庐。
- lambda表達(dá)式的參數(shù)必須是不變的,至少用起來是不變的。
int sum = 0;
List<Integer>aList = Arrays.asList(1,2,3,4,5);
aList.stream().forEach(()->{sum++;}); //這是錯(cuò)誤的例子
+ 返回stream類型的方法是lazy方法
> lazy方法里面lambda參數(shù)是不會立即求值的
```java
aList.stream().map(e->{
System.out.println(e);
return e;
});
以上代碼是不會輸出任何aList里面的元素佳吞。
- 返回非stream類型的方法則為eager方法
eager方法則會立即求值
aList.stream().map(e->{
System.out.println(e);
return e;
}).count();
以上代碼則會輸出aList里面的每個(gè)元素拱雏。
- 能用聚合函數(shù)的盡量使用聚合函數(shù)
在內(nèi)置的聚合函數(shù)能滿足需求的情況下, 如果只是再實(shí)現(xiàn)內(nèi)置聚合函數(shù)的話真的是多此一舉底扳,至少代碼看起來真的好難看铸抑,性能也不一定比內(nèi)置的好。//之前這句話有筆誤衷模。
- 根據(jù)業(yè)務(wù)需求選用并行/非并行的stream鹊汛。
選擇并行stream的話要主要考慮:
- stream的大小
- 可用的線程數(shù)
- 操作塊的大小
- 方法引用真的很bug,用得好代碼很簡潔。