为什么我应该使用collect(Collectors.toList()),当我没有它时?

时间:2017-11-27 09:36:56

标签: java java-8 java-stream collectors

我在许多Java 8参考资料和示例中看到了以下代码:

List <Integer> l = Arrays.asList(7, 3, 9, 8, 6, 5, -1, -100);  

l.stream().filter(y -> y <l.get(0)).collect(Collectors.toList()).
      forEach(System.out::println);

但是,我可以使用以下方法获得相同的结果:

l.stream().filter(y -> y <l.get(0)).forEach(System.out::println);

那么,使用几乎无处不在的收集(Collectors.toList())的神圣性是什么?

3 个答案:

答案 0 :(得分:6)

如果你关心的只是打印通过filter的元素,那么你就不需要collect(Collectors.toList())

使用...collect(Collectors.toList()).forEach(System.out::println)是一种浪费,因为它会创建一个List实例,您不会保留引用,因此永远无法访问。

如果要创建collect(Collectors.toList())的{​​{1}}个元素,请使用List。您通常会引用该Stream

答案 1 :(得分:3)

仅查看the documentationStream#forEach 非确定性(例如,您无法知道在并行流中访问元素的顺序是什么一般情况)。所以我认为你需要在你访问元素的顺序(或者当然,任何其他你想要一个列表的时间)需要确定性的时候使用collect(Collectors.asList()),当然,不是在你没有。

特定的示例中,您知道流不是并行的,因为Collection#stream会返回顺序流。

答案 2 :(得分:2)

在这种情况下,将流收集到列表确实毫无意义。当您明确需要列表对象时(例如,为了将其传递给其他API),应该使用收集来创建列表(或集合,映射或其他)。