使用distinct()和collect(toSet())是否值得

Nei*_*den 12 java java-stream

将流的元素收集到集合中时,是否还有.distinct()在流上指定的优点(或缺点)?例如:

return items.stream().map(...).distinct().collect(toSet());
Run Code Online (Sandbox Code Playgroud)

鉴于该集合已经删除了重复项,这似乎是多余的,但它是否提供任何性能优势或劣势?答案取决于流是并行/顺序还是有序/无序?

Ste*_*ner 10

根据javadoc,distinct是一个有状态的中间操作.

如果你真的已经.distinct紧随其后.collect,它并没有真正增加任何好处.也许如果.distinct实现比Set复制检查更高效,你可能会获得一些好处,但是如果你收集到一个集合,你最终会得到相同的结果.

另一方面,如果在操作.distinct之前发生.map,并且特定映射是一项昂贵的操作,那么您可能会获得一些收益,因为您整体上处理的数据较少.

  • `distinct` 不是魔法。它基本上在内部填充了一个`HashSet`(或订购时的`LinkedHashSet`)。如果有一种方法可以提高效率,即使用一些优化的内部类,那么位于同一个包中的 `toSet()` 收集器也会使用它...... (2认同)