我想通过合并两个Streams来填充List,对它们执行一些操作,最后获取所有元素并存储它们。我想到了两种方法:
集电极:
myList.addAll(Stream.concat(stream1, stream2)
.flatMap(foo -> someMethod(foo).stream())
.collect(Collectors.toList()));
的ForEach :
Stream.concat(stream1, stream2)
.flatMap(foo -> someMethod(foo ).stream())
.forEach(myList::add);
是否存在将一种解决方案从使用中解脱出来的性能差异?
第一个收集器使用方法是否会创建一个临时列表,该列表会被List#addAll
立即使用和丢弃?
修改 本课题旨在生成以某种方式解释功能和/或性能的答案。我不想开始讨论“看起来更好”的方式等等。这将是基于意见的。
答案 0 :(得分:1)
我不是关于流API的专家,但我希望collect
更好的选择,因为它有更多的信息。
foreach
方法无法预先知道流的大小,将正确的大小分配给myList
等。
理论上collect
方法可能有权访问可用于进行优化的更多信息。作为一般经验法则,我倾向于使用一次性执行整个操作的方法,而不是迭代它们。在最坏的情况下,操作将在内部进行迭代。
它与旧学校集合处理的方式相同,您赞成list.addAll(x)
,而不是迭代x
并添加每个元素。 addAll
有可能进行您不了解的优化,并且在最坏的情况下将具有与手动迭代相同的性能。