我在许多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())的神圣性是什么?
答案 0 :(得分:6)
如果你关心的只是打印通过filter
的元素,那么你就不需要collect(Collectors.toList())
。
使用...collect(Collectors.toList()).forEach(System.out::println)
是一种浪费,因为它会创建一个List
实例,您不会保留引用,因此永远无法访问。
如果要创建collect(Collectors.toList())
的{{1}}个元素,请使用List
。您通常会引用该Stream
。
答案 1 :(得分:3)
仅查看the documentation,Stream#forEach
非确定性(例如,您无法知道在并行流中访问元素的顺序是什么一般情况)。所以我认为你需要在你访问元素的顺序(或者当然,任何其他你想要一个列表的时间)需要确定性的时候使用collect(Collectors.asList())
,当然,不是在你没有。
在特定的示例中,您知道流不是并行的,因为Collection#stream
会返回顺序流。
答案 2 :(得分:2)
在这种情况下,将流收集到列表确实毫无意义。当您明确需要列表对象时(例如,为了将其传递给其他API),应该使用收集来创建列表(或集合,映射或其他)。