Java 我可以不使用collect(collector.toList()),为什么还要使用它?
我在许多Java 8参考资料和示例中看到了以下代码: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);
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);