用Java创建预填充集

Sal*_*Sal 18 java initialization declaration set

在Java中,如何创建在构造时填充的最终Set?我想做类似以下的事情:

static final Set<Integer> NECESSARY_PERMISSIONS 
    = new HashSet<Integer>([1,2,3,6]);
Run Code Online (Sandbox Code Playgroud)

但我不知道Java中的正确语法.

Tom*_*icz 57

试试这个成语:

import java.util.Arrays;

new HashSet<Integer>(Arrays.asList(1, 2, 3, 6))
Run Code Online (Sandbox Code Playgroud)


Pau*_*ora 19

您可以考虑使用Guava ImmutableSet:

static final Set<Integer> NECESSARY_PERMISSIONS = ImmutableSet.<Integer>builder()
        .add(1)
        .add(2)
        .add(3)
        .add(6)
        .build();
static final Set<String> FOO = ImmutableSet.of("foo", "bar", "baz");
Run Code Online (Sandbox Code Playgroud)

除此之外,它明显更快(并且空间效率提高约3倍)HashSet.


JB *_*zet 8

使用标准Java类的最简单方法是

static final Set<Integer> NECESSARY_PERMISSIONS = 
    Collections.unmodifiableSet(new HashSet<Integer>(Arrays.asList(1, 2, 3, 6)));
Run Code Online (Sandbox Code Playgroud)

但您也可以使用静态初始化程序,或委托给私有静态方法:

static final Set<Integer> NECESSARY_PERMISSIONS = createNecessaryPermissions();
Run Code Online (Sandbox Code Playgroud)

请注意unmodifiableSet包装器,它保证您的常量集确实是常量.


Xae*_*ess 7

使用您可以使用的Google GuavaImmutableSet,它完全针对这种情况设计(常量值):

static final ImmutableSet<Integer> NECESSARY_PERMISSIONS =
        ImmutableSet.of(1,2,3,6);
Run Code Online (Sandbox Code Playgroud)

老派方式(没有任何图书馆):

static final Set<Integer> NECESSARY_PERMISSIONS =
        new HashSet<Integer>(Arrays.asList(1,2,3,6));
Run Code Online (Sandbox Code Playgroud)


Kon*_*tov 6

您可以通过以下方式执行此操作,与本主题中的其他示例相比,IMO更好,更简洁:

public static <T> Set<T> set(T... ts) {
    return new HashSet<>(Arrays.asList(ts));
}
Run Code Online (Sandbox Code Playgroud)

静态导入后,您可以编写如下内容:

public static final Set<Integer> INTS = set(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)