这是java.util.stream.Collectors类的toSet()方法的实现:
public static
Collector> toSet() {
return new CollectorImpl<>((Supplier>) HashSet::new, Set::add,
(left, right) -> { left.addAll(right); return left; },
CH_UNORDERED_ID);
}
我们可以看到,它使用HashSet并调用add.从HashSet documentation,“它不能保证集合的迭代顺序;特别是,它不能保证订单随时间保持不变.”
在以下代码中,String of String被流式传输,排序并收集到Set中:
public static void main(String[] args) {
Set strings = Arrays.asList("c", "a", "b")
.stream()
.sorted()
.collect(Collectors.toSet());
System.out.println(strings.getClass());
System.out.println(strings);
}
这提供了输出:
class java.util.HashSet
[a,b,c]
输出已排序.我认为这里发生的事情是,尽管HashSet文档提供的合同规定了排序不是它提供的,但实现恰好按顺序添加.我想这可能会在未来的版本中发生变化/在JVM之间变化,而更明智的方法是做一些像Collectors.toCollection(TreeSet :: new)这样的事情.
调用Collectors.toSet()时可以依赖sorted()吗?
此外,“它不能保证订单在一段时间内保持不变”究竟是什么意思? (我想添加,删除,调整底层数组的大小?)