最近把《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,用得好代码很简洁。