在 Foreach Lambda 中使用上一个元素的 Java 流
我有一个数字列表,里面有一些。由于在我的情况下意味着无效度量,因此我需要使用在前面的位置中找到的第一个非0元素更改值元素。0s
0
0
例如,列表
45 55 0 0 46 0 39 0 0 0
必须成为
45 55 55 55 46 46 39 39 39 39
这是使用经典的实现for each
int lastNonZeroVal = 0;
for (MntrRoastDVO vo : res) {
if (vo.getValColor() > 0) {
lastNonZeroVal = vo.getValColor();
} else {
vo.setValColor(lastNonZeroVal);
}
}
有没有办法用Java Streams和Lambda Functions来实现这一点?
由于我知道我不能在foreach lambda中更改流的源,因此实际上列表是对象列表,我不会更改列表的元素,而只是分配新值。
这是我的第一个解决方案
int lastNonZeroVal = 1;
resutl.stream().forEach(vo -> {
if(vo.getValColor()>0){
lastNonZeroVal=vo.getValColor();
}else{
vo.setValColor(lastNonZeroVal);
}
});
但我也在这里阅读
最好是传递给流操作的 lambda 完全没有副作用。也就是说,它们在执行期间不会改变任何基于堆的状态或执行任何 I/O。
这让我担心
数据已分区,不能保证在处理给定元素时,该元素之前的所有元素都已处理完毕。
这个解决方案会产生无效的结果,也许当列表中的元素数量很高时??事件如果我不使用 ?parallelStream()