最近把《Java8 Lambda》這本書翻完了,就總結一下印象比較深刻的細節吧。
- lambda表達式的參數必須是不變的,至少用起來是不變的。
int sum = 0;
List<Integer>aList = Arrays.asList(1,2,3,4,5);
aList.stream().forEach(()->{sum++;}); //這是錯誤的例子
+ 返回stream類型的方法是lazy方法
> lazy方法里面lambda參數是不會立即求值的
```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里面的每個元素。
- 能用聚合函數的盡量使用聚合函數
在內置的聚合函數能滿足需求的情況下, 如果只是再實現內置聚合函數的話真的是多此一舉,至少代碼看起來真的好難看,性能也不一定比內置的好。//之前這句話有筆誤。
- 根據業務需求選用并行/非并行的stream。
選擇并行stream的話要主要考慮:
- stream的大小
- 可用的線程數
- 操作塊的大小
- 方法引用真的很bug,用得好代碼很簡潔。