.asSet(…)是否存在于任何API中?


Answers:


84

现在,使用Java 8,您无需第三方框架即可执行此操作:

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

查看收藏家

请享用!


4
如今,对于Java 8,这可能是最好的答案,因为它不依赖于第三方库并且可以轻松地适应其他集合类型,因此我将其设置为公认的类型。非常感谢大家提供的其他出色解决方案。(顺便说一句,这组是可变的)
cahen

3
现在,谁说Java太冗长了?当然,这是最好的答案!
BobDoolittle '17

非常感谢@BobDoolittle!
安德森先生

2
对于使用Java 9+的任何人,也请参见下面的Holly答案:stackoverflow.com/a/48025159/229743
Taylor

1
完美的答案安德森先生!
gaurav

63

使用Guava,就这么简单:

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

或对于可变集:

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

有关更多数据类型,请参阅《Guava用户指南》


是否有此版本的不可变版本?
cahen 2013年

3
@cahen是:Sets.newHashSet("a", "b")还是Sets.newLinkedHashSet("a", "b")
肖恩·帕特里克·弗洛伊德

1
我在答案中添加了可变的变体。
MichaelSchmeißer,

实际上,Sets.newLinkedHashSet()该签名不存在,对不起
Sean Patrick Floyd

我能够删除类型参数之一:Set<String> mySet = ImmutableSet.of("a", "b");
joshden


24

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

java.util.Collections.EMPTY_SET

和:

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

对于这些特殊情况,它可能是最好的解决方案,因为它使用标准的java.util API
arcuri82 '16

2
java.util.Collections.emptySet()在我看来,由于类型安全性,因此优先于EMPTY_SET使用。来自收藏类的评论:Unlike the like-named field, this method is parameterized.
Eddified '18

17

正如其他人所说,请使用:

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)

没有JDK实现一个“固定大小”的Set内部Arrays类。你为什么要这个?A Set保证没有重复项,但是如果您手动键入重复项,则不需要该功能...并且List具有更多方法。这两个接口都扩展了CollectionIterable


正如其他人所说,如果您确实想要此功能,请使用番石榴 -因为它不在JDK中。查看他们的答案(尤其是MichaelSchmeißer的答案)以获取有关此信息。


3
到目前为止,这是最好的答案,因为它指出了Arrays.asList()的实际作用。许多开发人员似乎都相信Arrays.asList()创建了一个java.util.ArrayList,而实际上却创建了一个java.util.Arrays $ ArrayList(它仅是部分可变的,并且是底层数组的实时视图)
Sean Patrick Floyd

1
至于为什么有人要这样做,最常见的原因是手动构造一个Set(或List)是在您传递测试值的测试类中。
Scott McIntyre

14

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

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

(也有等效项List。)


我尝试了此操作,并得到了编译器警告,这不是API方法。
Philippe Gioseffi

这是相关的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 /…
Holly Cummins

希望我们可以使用Java9。我们生活在过去!:(
jDub9

很好,但是对参数的大小有一些限制...
Radoslav Ivanov



2

这是您可以使用的一些方法

  /**
   * 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));
  }

1

使用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中所见

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.