有一个简单的查询,它过滤一个列表并获取找到的项的字段值。
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());发布于 2018-06-26 15:00:38
不,在Java8流处理流水线中,一个数据项在一次遍历中被处理。这样我们就可以执行短路评估,并给我们更多的优化空间。
例如,在您的案例中,我们采用第一项,应用筛选器,假设它满足筛选器条件。然后,我们继续进行映射并推送该元素。我们不需要访问流源中的任何其他元素,因为我们在一遍中处理它。这种短路评估允许我们进行更多的优化。
然而,处理流水线的第二种表示是错误的。你不能把map放在最后。但是,终端操作findFirst应该在管道的末尾。
https://stackoverflow.com/questions/51036500
复制相似问题