有一个简单的查询,可以过滤列表并获取找到的项目的字段值。
myList.getParents().stream()
.filter(x -> x.getSomeField() == 1)
.map(x -> x.getOtherField())
.findFirst();
是否按照代码执行一个接一个的操作:从初始列表中过滤掉someField
为1的所有内容,之后我们创建具有另一个字段的值的新列表,然后取其中的第一个新清单?
让我们想象一下,此列表中有1 000万个项目,过滤后为1000个。它将映射这1000个项目以仅获得其中的第一个项目吗?
如果我更改订单,它会优化性能还是本身足够聪明?
myList.getParents().stream()
.filter(x -> x.getSomeField() == 1)
.findFirst()
.map(x -> x.getOtherField());
答案 0 :(得分:2)
否,在Java8流处理管道中,仅一次处理一个数据项。这样,我们就可以执行短路评估,并为我们提供更多的优化空间。
例如,在您的情况下,我们采用第一项,应用过滤器,并假设它满足过滤器标准。然后,我们继续进行映射并推送该元素。我们不需要访问流源中的任何其他元素,因为我们可以一次处理它。这种短路评估使我们可以进行更多优化。
但是处理流水线的第二个表示是错误的。结尾不能为map
。终端操作findFirst
应该在管道的结尾。