stream流之peek和forEach的区别
相同点:都可以对集合进行遍历操作
不同点:peek()方法,会重新返回一个相同元素的流;forEach()方法,会直接对原有的列表进行遍历操作。
问题
下面有一段代码,我需要对一个list进行操作,如果list中对象的id不为空,设置该对象的所属编号
Idea警告:Result of ‘Stream.peek()’ is ignored。提示:返回的流被忽视,并未使用
vo.getProductList().peek(product -> {
if (Objects.isNull(product.getId())) {
product.setSaleApplyNo(vo.getSaleApplyNo());
}
productDao.upsert(product);
});
如果此时使用的是peek方法,而且没有对stream流进行终止操作,此时peek方法中的操作不会生效!
原因
peek只能作为管道中途的一个处理步骤,而没法直接执行得到结果,其后面必须还要有其它终止操作的时候才会被执行
解决方案
1、对返回的流进行collect
productList = vo.getProductList().peek(product -> {
if (Objects.isNull(product.getId())) {
product.setSaleApplyNo(vo.getSaleApplyNo());
}
productDao.upsert(product);
}).collect(Collectors.toList());
2、使用forEach()方法
vo.getProductList().forEach(product -> {
if (Objects.isNull(product.getId())) {
product.setSaleApplyNo(vo.getSaleApplyNo());
}
productDao.upsert(product);
});
总结
如果
peek
返回的元素流并没有使用到,建议使用forEach
进行处理