【发布时间】:2022-01-08 07:39:49
【问题描述】:
如果我有 HashSet 并且我使用流 .filter() 进行某些操作然后执行 .collect(Collectors.toList()) 与仅将流收集回 HashSet .collect(Collectors.toSet()) 相比效率会低吗?
与将 HashSet 显式转换为 List O(n) 所需的时间相似,还是 Stream 与将元素添加回 List 或 Set 所需的时间不同?
数据集非常大。我想使用 List,因为它消耗的内存更少,但我不想为此牺牲速度。
代码示例:
Set<Object> originalSet; // this is a set containing 800,000 Objects
// Scenario 1
List<Object> newList = originalSet.stream().filter(Object::isEnabled).collect(Collectors.toList())
// Scenario 2
Set<Object> newSet = originalSet.stream().filter(Object::isEnabled).collect(Collectors.toSet())
【问题讨论】:
-
你能展示一个代码示例而不是用文字描述代码吗? “一张图片胜过 1000 个字”
-
@StackOverthrow 从概念上讲,它与包含添加到新列表或集合的 if 语句的 for 循环没有什么不同。就是这样,但功能风格。
-
toList和toSet都创建新的集合对象来存储结果。如果您从List流式传输,其中一个不会突然变得更快。这能回答你的问题吗? -
@LouisWasserman 您基本上是对的,但是“任何方面”都夸大了。流确实会根据源保留 一些 标志,这可能会对行为产生微妙的影响。列表中的流将具有 ORDERED 标志,而集合中的流应具有 DISTINCT 标志:ideone.com/QXTIpC
标签: java collections java-stream