stream流之peek和forEach的区别

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进行处理

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值