【问题标题】:Are java 8 stream operations optimized? [duplicate]java 8流操作是否优化? [复制]
【发布时间】:2018-06-26 15:33:22
【问题描述】:

有一个简单的查询过滤列表并获取找到的项目的字段值。

myList.getParents().stream()
                .filter(x -> x.getSomeField() == 1)
                .map(x -> x.getOtherField())
                .findFirst();

操作是否像代码一样一个接一个地执行:从初始列表中过滤所有someField为1的地方,在它之后我们创建具有另一个字段值的新列表,然后我们在这个新列表中取第一个?

让我们假设这个列表中有 1 000 000 个项目,过滤后它们是 1000 个。它会映射这 1000 个项目以仅获取其中的第一个吗?

如果我更改顺序,它会优化性能还是它本身足够聪明?

myList.getParents().stream()
   .filter(x -> x.getSomeField() == 1)
   .findFirst()
   .map(x -> x.getOtherField());

【问题讨论】:

  • 来自文档:流是懒惰的;源数据的计算只在终端操作启动时进行,源元素只在需要时消费。
  • 我认为第二个很好,因为地图功能在 Optional 中而不是在流中。

标签: java-8 java-stream


【解决方案1】:

不,在 Java8 流处理管道中,一次处理一个数据项。这样我们就可以进行短路评估,并为我们提供更多优化空间。

例如,在您的情况下,我们采用第一项,应用过滤器,假设它满足过滤条件。然后我们继续进行映射并推送该元素。我们不需要访问流源中的任何其他元素,因为我们一次性处理它。这种短路评估使我们能够进行更多优化。

但是处理管道的第二种表示是错误的。最后不能有map。终端操作findFirst 应该在管道的末尾。

【讨论】:

  • 第二个 sn-p 仍然可以工作,因为 findFirst 返回一个 Optional,它有一个 map 方法。
  • 同意你的观点!
猜你喜欢
  • 2016-10-09
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 2015-07-07
相关资源
最近更新 更多