用Java填充包含所有枚举值的列表

104
我想用枚举中所有可能的值填充一个列表。 由于我最近爱上了EnumSet,我利用了allOf()方法。
EnumSet<Something> all = EnumSet.allOf( Something.class);
List<Something> list = new ArrayList<>( all.size());
for (Something s : all) {
    list.add( s);
}
return list;

有没有更好的方法(即非混淆的单行代码)来达到相同的结果?


ArrayList<Something> list = new ArrayList<Something>(Arrays.asList(Something.values()))。(其中Something是一个枚举类型) - TacB0sS
10个回答

205

我不会首选使用 List,因为 EnumSet 更合适,但你可以这样做。

List<Something> somethingList = Arrays.asList(Something.values());
或者
List<Something> somethingList =
                 new ArrayList<Something>(EnumSet.allOf(Something.class));

3
有时候 EnumSet 不够用。特别是当顺序很重要的时候。 - MonoThreaded
1
@MonoThreaded 你有什么顺序想法吗?EnumSet对于枚举来说是自然顺序。列表将按照集合相同的顺序排列,因此在这里使用List不会改变任何内容。 - Peter Lawrey
1
抱歉,本问题不涉及排序。我相信你在第一个例子中想表达的是values()。 - MonoThreaded
@PeterLawrey我们一直在使用枚举。 当我们设计工作流时,审核过程可能不会按照枚举的“自然顺序”移动,这就是为什么使用List <Enum>EnumSet更方便的原因。 - buzzsawddog
EnumSet没有get()方法(方便随机访问),而List有。这可能对于List/EnumSet预期使用的功能很重要。 - pallgeuer

16

10

ArrayList有一个构造函数,它是:

ArrayList(Collection<? extends E> c) 

现在,EnumSet 扩展了 AbstractCollection,因此您只需执行以下操作即可:

ArrayList<Something> all = new ArrayList<Something>(enumSet)

10
尝试
enum E {
    E1, E2, E3
}

public static void main(String[] args) throws Exception {
    List<E> list = Arrays.asList(E.values());
    System.out.println(list);
}

值得澄清的是,您不会得到一个java.util.ArrayList,正如问题中所述。 - planetjones

1
List<Something> result = new ArrayList<Something>(all);

EnumSet 是 Java 集合的一种,因为它实现了 Set 接口:

public interface Set<E> extends Collection<E> 

因此,您可以使用EnumSet执行与集合相同的操作。


0
我知道问题是关于List的,但我认为我有可能更简洁的解决方案,以及一个尚未添加的使用List的解决方案。
我正在使用Java 17 简单地使用一个enum数组即可。
public class Main {
    static public enum Something {
        One,
        Two,
        Three,
        Four,
        Five,
        ;

    }

    public static void main(String[] args) {
        Something[] somethings = Something.values();
        for (Something something: somethings) {
            System.out.printf("- %s\n", something);
        }

    }

}


使用enum.values()来获取枚举的所有值。 Something[] somethings = Something.values(); 使用list.of

import java.util.List;

public class Main {
    static public enum Something {
        One,
        Two,
        Three,
        Four,
        Five,
        ;

    }

    public static void main(String[] args) { 
        List<Something> somethings2 = List.of(Something.values());
        for (Something something: somethings2) {
            System.out.printf("- %s\n", something);
        }
    }

}


我看到过使用Arrays.asList()的解决方案,正如什么是List.of和Arrays.asList之间的区别?中所描述的。

Arrays.asList返回一个可变列表,而List.of返回的列表是不可变的

或者

Arrays.asList允许包含空元素,而List.of不允许

还有其他一些原因。 因为从一个enum数组理论上来说,你不应该能够改变它(添加/删除元素),所以我认为使用List.of更有意义。 不管怎样,这取决于具体的使用情况,两种方法都可能有效。

0

这样读起来更容易一些:

Object[] allValues = all.getDeclaringClass().getEnumConstants();

1
那么你只需要简单地执行 Something.class.getEnumConstants() 对吧? - shyam
2
... 或者 Something.values(); - Peter Lawrey

0

试试这个:

... = new ArrayList<Something>(EnumSet.allOf(Something.class));

ArrayList有一个带有Collection<? extends E>的构造函数。但只有在您真正想使用EnumSet时才使用此方法。

所有枚举都可以访问values()方法。它返回所有枚举值的数组:

... = Arrays.asList(Something.values());

0

你也可以使用:

Collections.singletonList(Something.values())

我正在获取十六进制代码。 - Satish Patro

-3
private ComboBox gender;
private enum Selgender{Male,Famle};
ObservableList<Object> observableList  =FXCollections.observableArrayList(Selgender.values());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接