【问题标题】:Java List.addAll using collection's stream instead of using collection itself?Java List.addAll 使用集合的流而不是使用集合本身?
【发布时间】:2016-10-10 12:40:34
【问题描述】:

最近在List.addAll中发现了一个使用stream的代码sn-p,但是看不到使用的原因。

所以给出了一个简单的列表。 List<E> subList 作为参数传递给方法。有一个是另一个,它是一个字段并且包含相同类型的元素。 List<E> originalList.

这里是用子列表的元素扩展原始列表的部分。

originalList.addAll(subList.stream().collect(Collectors.toList()))

我不明白:为什么作者在这里使用流而不是执行以下操作:

originalList.addAll(subList)

在这种情况下使用流有什么好处吗?

【问题讨论】:

  • 流版本比非流版本更能温暖数据中心。
  • 老实说,我觉得这很奇怪,但由于我不熟悉流,但我不想评判任何人。 :)
  • 我会问作者。对我来说,它闻起来像是有人在尝试一种新方法,而不是它有任何优势。列出缺点更容易;)

标签: java list java-8 java-stream


【解决方案1】:

完全没有区别,使用originalList.addAll(subList) 将完全一样,因为addAll() 方法在内存中创建subList 的数组副本,并且不指向相同的引用。可能Stream中有一些中间操作被清除了,作者忘记清理代码了。

使用originalList.addAll(subList),因为不需要创建流并将其收集到List,这只是不必要的操作。

【讨论】:

    【解决方案2】:

    事情是:,连同“好的 lambdas”可以比“老派”循环方法有更好的性能。但这在很大程度上取决于您的上下文(有关此主题的广泛讨论,请参阅here)。

    当然,当您有一些基于 stream() 的操作时,流的真正性能就会发挥作用;只需将其更改为 parallelStream() 即可开始并行处理。但是(当然也是):你仍然需要知道你在做什么!并非所有东西都可以那么容易地“并行”。

    谈论您展示的示例:在那里使用流没有任何好处。

    【讨论】:

    • 感谢您的回答和文章。
    猜你喜欢
    • 2017-07-02
    • 1970-01-01
    • 2018-10-26
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多