代码之家  ›  专栏  ›  技术社区  ›  k13i

哪个集合在collectors.toset()中实现?[复制品]

  •  3
  • k13i  · 技术社区  · 6 年前

    我有以下代码:

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

    Javadoc 属于 toSet() 方法一可以读取:

    对返回的集合的类型(…)没有保证

    我看了一下 () 一眼就能看出 HashSet 总是返回(至少在JDK 11中)。

    我知道,在未来实施可能会发生变化,而不会违反合同,但目前是否有任何情况下不同于 哈希表 回来了吗?

    5 回复  |  直到 6 年前
        1
  •  2
  •   Jens Bannmann skiwi    6 年前

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

        2
  •  4
  •   Joe C    6 年前

    从JDK 11开始, Set 返回的 Collectors.toSet() 是一个 HashSet . 当然,这可以改变Java的未来版本,因此,您不应依赖于此。

    如果您希望使用特定类型的 集合 ,您应该使用 Collectors.toCollection 相反,提供一个lambda来创建您选择的集合。

        3
  •  3
  •   Ori Marko    6 年前

    使用 Collectors.toCollection 对于不同的集合实现:

    // Accumulate names into a TreeSet
    Set<String> set = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new));
    
        4
  •  3
  •   Eugene    6 年前

    为了回答你的第二个问题

    Collectors::toUnmodifiableSet
    

    自从 java-11 ,返回不可变的 Set 在Java-9中添加的。

        5
  •  1
  •   Shailesh Tanwar    6 年前

    collectors toset()返回将输入元素累积到新集合中的收集器。对于返回的集的类型、可变性、可序列化或线程安全性没有任何保证。这是一个无序的收集器,即收集操作不会承诺保留输入元素的遇到顺序。

    如果您希望对此有更多的控制权,请改用ToCollection。