【问题标题】:java stream mutate data with terminal operation [duplicate]java流变异数据与终端操作[重复]
【发布时间】:2017-06-20 03:52:34
【问题描述】:

Java Stream Cheat Sheet

通过这个 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


【解决方案1】:

您不能改变 fooList,但您可以使用终端操作对元素执行副作用。正如备忘单所说,流是管道,而不是数据结构。你不能改变不是数据结构的东西,但你可以操纵流经管道的各个元素。

【讨论】:

    猜你喜欢
    • 2020-10-07
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多