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

cah*_*hen 97 java collections

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

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

有类似的东西Set吗?

Mr.*_*son 62

现在使用Java 8,您可以在不需要第三方框架的情况下执行此操作:

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

请参阅收藏家.

请享用!

  • 现在使用Java 8,这可能是最好的答案,因为它不依赖于第三方库,并且可以很容易地适应其他集合类型,因此我将其设置为已接受的集合类型.非常感谢大家为其他伟大的解决方案.(顺便说一句,这个Set是可变的) (4认同)
  • 现在,谁说Java过于冗长?当然这是最好的答案! (2认同)
  • 对于使用 java 9+ 的任何人,请参阅下面的 Holly 回答:/sf/answers/3361761161/ (2认同)

Mic*_*ßer 58

使用Guava,它就是这么简单:

Set<String> mySet = ImmutableSet.<String> of("a", "b");
Run Code Online (Sandbox Code Playgroud)

或者对于一个可变集:

Set<String> mySet = Sets.newHashSet("a", "b")
Run Code Online (Sandbox Code Playgroud)

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

  • @cahen yes:`Sets.newHashSet("a","b")`或`Sets.newLinkedHashSet("a","b")` (3认同)

Dev*_*ked 52

你可以用

new HashSet<String>(Arrays.asList("a","b"));
Run Code Online (Sandbox Code Playgroud)


Sam*_*ard 23

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

java.util.Collections.EMPTY_SET
Run Code Online (Sandbox Code Playgroud)

和:

java.util.Collections.singleton("A")
Run Code Online (Sandbox Code Playgroud)

  • `java.util.Collections.emptySet()` 在我看来,由于类型安全,比 EMPTY_SET 更受欢迎。来自 Collections 类中的注释:`与同名字段不同,此方法是参数化的。` (2认同)

dur*_*597 17

正如其他人所说,使用:

new HashSet<String>(Arrays.asList("a","b"));
Run Code Online (Sandbox Code Playgroud)

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

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

返回:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(Unknown Source)
    at java.util.AbstractList.add(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

有没有一个"固定大小"的JDK实现Set内部Arrays类.你为什么要这个?一个Set保证没有重复,但如果你是用手工打字出来,你不应该需要这些功能...并List有更多的方法.两个接口都扩展CollectionIterable.


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

  • 到目前为止,这是最好的答案,因为它指出了Arrays.asList()实际上做了什么.许多开发人员似乎相信Arrays.asList()会创建一个java.util.ArrayList,而它实际上会创建一个java.util.Arrays $ ArrayList(它只是部分可变的并且是底层数组的实时视图) (3认同)

Hol*_*ins 12

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

Set<String> oneLinerSet = Set.of("a", "b", ...);
Run Code Online (Sandbox Code Playgroud)

(也有等价物List.)


Evg*_*eev 6

不,但你可以这样做

new HashSet<String>(Arrays.asList("a", "b", ...));
Run Code Online (Sandbox Code Playgroud)


Stu*_*ark 5

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

  /**
   * 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));
  }
Run Code Online (Sandbox Code Playgroud)