我有以下代码:
Stream.of(1, 4, 5).collect(Collectors.toSet());
从toSet()
方法的Javadoc中可以读到:
不能保证返回的Set的类型(...)
我看了toSet()
方法的实际实现,乍一看似乎总是返回HashSet
(至少在JDK 11中如此)。
我知道将来可以更改实现而不会违反合同,但是当前是否存在返回不同于HashSet
的实现的情况?
答案 0 :(得分:4)
从JDK 11开始,Set
返回的Collectors.toSet()
的类型为HashSet
。当然,这可以在Java的将来版本中进行更改,因此您不应依赖于此。
如果您希望使用特定类型的Set
,则应改用Collectors.toCollection
,并提供一个lambda来创建您选择的集合。
答案 1 :(得分:3)
将Collectors.toCollection用于不同的Set实现:
// Accumulate names into a TreeSet Set<String> set = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new));
答案 2 :(得分:3)
要回答您的第二个问题
Collectors::toUnmodifiableSet
自java-11
开始,它返回在Java-9中添加的不变的Set
。
答案 3 :(得分:2)
不。 JDK source code清楚地表明Collectors.toSet()
始终使用HashSet::new
。正如您所说,那当然可能会改变。
答案 4 :(得分:1)
Collectors toSet()返回一个收集器,该收集器将输入元素累积到一个新的Set中。不能保证返回的Set的类型,可变性,可序列化性或线程安全性。这是一个无序的收集器,即收集操作不会致力于保留输入元素的遇到顺序。
如果要对此进行更多控制,请改用toCollection。