Javadoc 表示:
返回一个收集器,它将输入元素累积到一个新的 Set 中。不能保证返回的 Set 的类型、可变性、可序列化性或线程安全性;如果需要更多对返回的 Set 的控制,请使用 toCollection(java.util.function.Supplier)。
因此,Collectors.toCollection(HashSet::new)
似乎是避免问题的好主意(SO question)。
我的问题是,尽管我已经尝试过很多次,但我仍然无法从 toSet()
返回除 HashSet
之外的任何其他东西
这里是我使用的代码:
public static void main(String[] args) {
List<Integer> l = Arrays.asList(1,2,3);
for (int i = 0 ; i++<1_000_000;){
Class clazz = l.stream().collect(Collectors.toSet()).getClass();
if (!clazz.equals(HashSet.class)) {
System.out.println("Not a HashSet");
}
}
}
为什么Javadoc会声明没有保证,而实际上又确实存在保证呢...
HashSet::new
是硬编码为返回Set
的供应商(这解释了你的结果)。但是未来版本不保证不会更改此设置。 - Tunakii++<1_000_000;
有点奇怪。当然,这很聪明,但它并没有比i < 1_000_000; i++
更节省空间,而后者是大多数人倾向于使用的形式。如果你在一个与他人合作的项目中编码,我建议你尽量保持你的循环简单易懂。如果你是为自己编码,那就随意发挥吧。 - Jeffreyfor(…; i++<1_000_000;)
将处理值1_000_000
,而for(…; i < 1_000_000; i++)
则不会。这就是为什么应该避免使用这种不直观的结构,使用for(…; i <= 1_000_000; i++)
更容易识别... - Holger