【问题标题】:Which Set implementation in Collectors.toSet()? [duplicate]Collectors.toSet() 中的哪个 Set 实现? [复制]
【发布时间】:2019-06-20 12:20:58
【问题描述】:

我有以下代码:

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

toSet()Javadoc方法一可以读到:

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

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

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

【问题讨论】:

  • 不,它始终是一个哈希集,但正如文档所说:不要依赖它,永远不要直接依赖于实现细节。如果您出于某种原因需要一个哈希集而没有其他类型的集合起作用,只需转换您得到的集合。
  • 记住Stream是一个接口;可以有任意的实现,而不仅仅是 JRE 提供的那些。

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


【解决方案1】:

回答你的第二个问题

Collectors::toUnmodifiableSet

因为java-11,它返回一个不可变的Set,它是在java-9中添加的。

【讨论】:

    【解决方案2】:

    从 JDK 11 开始,Collectors.toSet() 返回的 Set 的类型是 HashSet。当然,这可能会在 Java 的未来版本中发生变化,因此您不应依赖它。

    如果您希望使用特定类型的 Set,则应改用 Collectors.toCollection,并提供 lambda 来创建您选择的集合。

    【讨论】:

      【解决方案3】:

      Collectors toSet() 返回一个收集器,它将输入元素累积到一个新的集合中。不保证返回的 Set 的类型、可变性、可序列化性或线程安全性。这是一个无序收集器,即收集操作不承诺保留输入元素的遇到顺序。

      如果您想对此进行更多控制,请改用 toCollection。

      【讨论】:

        【解决方案4】:

        没有。 JDK source code 清楚地表明Collectors.toSet() 始终使用HashSet::new。正如你所说,这当然可能会改变。

        【讨论】:

          【解决方案5】:

          Collectors.toCollection 用于不同的 Set 实现:

          // Accumulate names into a TreeSet
          Set<String> set = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-06-05
            • 1970-01-01
            • 2015-06-02
            • 1970-01-01
            • 2017-04-07
            • 1970-01-01
            • 2022-01-08
            相关资源
            最近更新 更多