【问题标题】:Does .asSet(...) exist in any API?.asSet(...) 是否存在于任何 API 中?
【发布时间】:2013-04-27 20:24:27
【问题描述】:

我正在寻找一种非常简单的方法来创建 Set。

Arrays.asList("a", "b" ...) 创建一个List<String>

Set 有什么类似的吗?

【问题讨论】:

标签: java collections


【解决方案1】:

现在使用 Java 8,您无需第三方框架即可做到这一点:

Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());

Collectors

享受吧!

【讨论】:

  • 现在,谁说 Java 太冗长了?当然这是最好的答案!
  • 非常感谢@BobDoolittle!
  • 对于使用 java 9+ 的任何人,另请参阅下面 Holly 的回答:stackoverflow.com/a/48025159/229743
  • 我仍然更喜欢使用 Java 8“流方式”而不是 Java 9 功能,因为“收集器”允许您自定义生成的集合(可能是“列表”、“设置”或任何自定义结构需要),而 java 9 的 utils 必须为每种集合类型单独调用(并且并非所有结构都有相应的 "util" )。
  • 安德森先生完美回答!
【解决方案2】:

使用Guava,就这么简单:

Set<String> mySet = ImmutableSet.<String> of("a", "b");

或者对于可变集合:

Set<String> mySet = Sets.newHashSet("a", "b")

更多数据类型见Guava user guide

【讨论】:

  • 这个有非不变的版本吗?
  • @cahen 是:Sets.newHashSet("a", "b")Sets.newLinkedHashSet("a", "b")
  • 我在答案中添加了一个可变变体。
  • 实际上,Sets.newLinkedHashSet() 不存在该签名,抱歉
  • 我能够删除其中一个类型参数:Set&lt;String&gt; mySet = ImmutableSet.of("a", "b");
【解决方案3】:

你可以使用

new HashSet<String>(Arrays.asList("a","b"));

【讨论】:

  • 我宁愿这样做,然后使用流版本。我可以简单地静态导入“asList”,这样就更简洁了。
【解决方案4】:

对于具有零个或一个成员的集合的特殊情况,您可以使用:

java.util.Collections.EMPTY_SET

和:

java.util.Collections.singleton("A")

【讨论】:

  • 对于这些特殊情况,它可能是最好的解决方案,因为它使用标准的 java.util API
  • 由于类型安全,在我看来,java.util.Collections.emptySet() 比 EMPTY_SET 更受欢迎。来自 Collections 类中的 cmets:Unlike the like-named field, this method is parameterized.
【解决方案5】:

在 Java 9 中,通过工厂方法添加了类似的功能:

Set<String> oneLinerSet = Set.of("a", "b", ...);

List 也有等价物。)

【讨论】:

  • 我试过了,编译器警告说这不是 API 方法。
  • 这里是相关的 java 文档:docs.oracle.com/javase/9/docs/api/java/util/Set.html。除了使用 Java 9+ JDK,您可能还需要调整 IDE 或构建工具以使用 Java 9 合规性(例如,对于 maven,它与此处的步骤类似,但设置为 1.9:stackoverflow.com/questions/16798066/…
  • 希望我们可以使用 Java 9.. 我们生活在过去! :(
  • 这很好,但对参数的大小有一些限制......
【解决方案6】:

正如其他人所说,使用:

new HashSet<String>(Arrays.asList("a","b"));

在Java中存在的原因是Arrays.asList返回一个固定大小的列表,换句话说:

public static void main(String a[])
{
  List<String> myList = Arrays.asList("a", "b");
  myList.add("c");
}

返回:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(Unknown Source)
    at java.util.AbstractList.add(Unknown Source)

Arrays 类中没有“固定大小”Set 的 JDK 实现。你为什么要这个? Set 保证没有重复项,但是如果您手动输入它们,则不需要该功能……而List 有更多方法。两个接口都扩展了CollectionIterable


正如其他人所说,如果你真的想要这个功能,请使用guava - 因为它不在 JDK 中。查看他们的答案(尤其是 Michael Schmeißer 的答案)以获取相关信息。

【讨论】:

  • 这是迄今为止最好的答案,因为它指出了 Arrays.asList() 的实际作用。许多开发人员似乎认为 Arrays.asList() 创建了一个 java.util.ArrayList,而实际上它创建了一个 java.util.Arrays$ArrayList(它只是部分可变的,并且是底层数组的实时视图)
  • 至于为什么有人要这样做,手动构造 Set(或 List)的最常见原因是在您传递测试值的测试类中。
【解决方案7】:

这是一个你可以使用的小方法

  /**
   * Utility method analogous to {@link java.util.Arrays#asList(Object[])}
   *
   * @param ts
   * @param <T>
   * @return the set of all the parameters given.
   */
  @SafeVarargs
  @SuppressWarnings("varargs")
  public static <T> Set<T> asSet(T... ts) {
    return new HashSet<>(Arrays.asList(ts));
  }

【讨论】:

  • 我实际上写了这个完全相同的解决方案——很好!
【解决方案8】:

不,但你可以这样做

new HashSet<String>(Arrays.asList("a", "b", ...));

【讨论】:

    【解决方案9】:

    您可以在guava 中使用

    Set<String> set = Sets.newHashSet("a","b","c");
    

    newHashSet

    【讨论】:

      【解决方案10】:

      使用 Java 8 和枚举的另一种方法是:

      Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);
      

      EnumSet

      我建议在这种方法和

      之间进行性能分析
      Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());
      

      因为如果您有五个以上的元素,则该方法的 javadoc 说明可能存在性能问题,正如您在 Set.Of(E, E...) 的 javadoc 中看到的那样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-23
        • 2021-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多