【发布时间】:2017-06-20 03:52:34
【问题描述】:
通过这个 Java Stream 备忘单 - 我知道 Java 流不能改变数据。
例如,在下面使用的代码中,我是否正确地说 - 使用 forEach 终端操作数据正在发生变异?
List<Foo> fooList=new ArrayList<>();
fooList.stream()
.filter(foo-> return foo.getSomeBoolean())
.forEach(foo->{
foo.setSomeBoolean(false);
});
我很困惑 forEach 终端操作会对数据产生副作用但不会改变数据?
有人可以解释一下如何允许 foreach 在这里改变数据吗?
【问题讨论】:
-
请仔细阅读:此数据不能变异。也就是说原始数据结构没有改变。你改变的是对象,而不是数据源。
-
来自
java.util.stream.Stream的文档:declaratively describing their source and the computational operations which will be performed in aggregate on that source。使用filter方法可以将Stream 转换为另一个Stream,使用forEach可以迭代流中的所有元素。forEach是终端操作。 -
编译器不反对的事实,甚至运行时没有异常的事实,都不能证明特定的操作是允许的。唯一重要的是正式规范。请注意,您并没有修改源集合,但如果相同的
Foo实例在源List中多次出现,则仍然可能有干扰。
标签: java java-8 java-stream