收集器或ForEach用于添加多个元素

时间:2014-10-13 09:53:47

标签: java functional-programming

我想通过合并两个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立即使用和丢弃?

修改 本课题旨在生成以某种方式解释功能和/或性能的答案。我不想开始讨论“看起来更好”的方式等等。这将是基于意见的。

1 个答案:

答案 0 :(得分:1)

我不是关于流API的专家,但我希望collect更好的选择,因为它有更多的信息。

foreach方法无法预先知道流的大小,将正确的大小分配给myList等。

理论上collect方法可能有权访问可用于进行优化的更多信息。作为一般经验法则,我倾向于使用一次性执行整个操作的方法,而不是迭代它们。在最坏的情况下,操作将在内部进行迭代。

它与旧学校集合处理的方式相同,您赞成list.addAll(x),而不是迭代x并添加每个元素。 addAll有可能进行您不了解的优化,并且在最坏的情况下将具有与手动迭代相同的性能。