Java 8流操作是否已优化?

时间:2018-06-26 06:48:36

标签: java-8 java-stream

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

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());

1 个答案:

答案 0 :(得分:2)

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

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

但是处理流水线的第二个表示是错误的。结尾不能为map。终端操作findFirst应该在管道的结尾。