Collectors.toSet()中的哪个Set实现?

时间:2019-01-27 07:38:34

标签: java set java-stream java-11 collectors

我有以下代码:

Stream.of(1, 4, 5).collect(Collectors.toSet());

toSet()方法的Javadoc中可以读到:

  

不能保证返回的Set的类型(...)

我看了toSet()方法的实际实现,乍一看似乎总是返回HashSet(至少在JDK 11中如此)。

我知道将来可以更改实现而不会违反合同,但是当前是否存在返回不同于HashSet的实现的情况?

5 个答案:

答案 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。