关于java stream流中的peek方法和foreach的自我理解:
场景:
我需要在数据库中将信息查出,在将其转化为某一个对象,再将该对象进行添加进入list集合
我首先想到的是stream().peek()方法,编写的代码如下:
productAttrValueService.getListBySpuIdAndAttrId(spuInfo,attrAttrgroupRelationEntity.getAttrId()).stream().peek(productAttrValueEntity -> {
SkuItemVo.SpuBaseAttrVo spuBaseAttrVo = new SkuItemVo.SpuBaseAttrVo();
spuBaseAttrVo.setAttrName(productAttrValueEntity.getAttrName());
spuBaseAttrVo.setAttrValue(productAttrValueEntity.getAttrValue());
spuAttrList.add(spuBaseAttrVo);
System.out.println("属性为:"+spuBaseAttrVo);
});
执行的结果为:
可以看到,并没有出现在peek中的打印信息(没有属性为:。。。。。。)
但是如果使用foreach进行遍历每一项,就会存在打印结果:
在查看了相应的资料和博客之后,我对于peek方法和foreach方法的理解是:
peek方法的作用主要是用于改变传入对象的内部信息,如果没有修改就不会执行peek中的代码;
foreach方法是不管你遍历的的目的是什么,都会执行foreach里边的代码。
我的推荐是:如果我们在遍历的时候需要存在返回值的情况,就使用stream().map()方法,如果没有返回值,仅仅是需要修改对象内部的信息,就使用stream().peek()方法,其他的都使用foreach进行遍历。