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