【发布时间】: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