Java 我可以不使用collect(collector.toList()),为什么还要使用它?

Java 我可以不使用collect(collector.toList()),为什么还要使用它?,java,java-8,java-stream,collectors,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); List l=Arrays.asList(7,3,9,8,6,5,-1,-100);

我在许多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);
List l=Arrays.asList(7,3,9,8,6,5,-1,-100);

l、 stream().filter(y->y如果您所关心的只是打印通过
过滤器的元素,那么您不需要
收集(collector.toList())

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


当您想要创建
流的
元素的
列表时,请使用
collect(Collectors.toList())
。您通常会保留对该
列表的引用。在这种情况下,将流收集到列表确实是毫无意义的。应该使用收集来创建列表(或集合,或映射,或其他)当您确实需要显式地使用列表对象时(例如,为了将其传递给其他API)。

仅看一下,
Stream#forEach
是不确定的(例如,在一般情况下,您无法知道元素在并行流中的访问顺序)。因此我认为您应该使用
collect(collector.asList())
当您需要确定访问元素的顺序时(当然,也可以在您需要列表的任何其他时间),当然,当您不需要时,就不需要了

在您的特定示例中,您知道流不是并行的,因为它返回一个顺序流。

stream.collect(…)&stream.forEach(…)
是使用给定流实例的结果的操作,它们没有任何返回类型。因此在您的示例中,您不需要两者都使用。
当您需要在变量列表中获取流输出的结果时,请使用collect(..)方法,并在以后的应用程序中使用它。

“我在许多Java 8参考资料和示例中看到了以下代码”,例如?我们的优秀老(和新)代码Stackoverflow:在那个例子中,他们想要的最终结果是一个列表,所以他们当然使用
collect(Collectors.asList())
。这个问题不是“Java 8参考资料”,它没有显示组合的
collect()
forEach()
你声称看到的“无处不在”事实上,一开始收集到列表中的示例太少了。今天,这种知识很普遍,但如果你看到打印前收集了Stackoverflow问题,很可能是因为这是简化的代码,在与问题无关的情况下忽略了对结果的实际处理当您想要确定性时,使用
forEachOrdered(…)
。当您想要的只是一个确定性的
forEach(…)
时,仍然没有理由使用
collect(collector.asList())
,如果流中有一个。(我想你是对的,人们经常使用
forEach-ordered
时使用
collect
就足够了。就这一点而言,可能他们根本不在乎订单,可以直接使用
forEach
l.stream().filter(y -> y <l.get(0)).forEach(System.out::println);