获取枚举值作为Java 8中的String列表

时间:2015-04-06 05:43:33

标签: java enums java-8

是否有任何Java 8方法或简单方法,它将Enum值作为String列表返回,如:

List<String> sEnum = getEnumValuesAsString();

3 个答案:

答案 0 :(得分:92)

你可以做(​​Java 8之前):

List<Enum> enumValues = Arrays.asList(Enum.values());

List<Enum> enumValues = new ArrayList<Enum>(EnumSet.allOf(Enum.class));

使用Java 8功能,您可以将每个常量映射到其名称:

List<String> enumNames = Stream.of(Enum.values())
                               .map(Enum::name)
                               .collect(Collectors.toList());

答案 1 :(得分:1)

您还可以执行以下操作

public enum DAY {MON, TUES, WED, THU, FRI, SAT, SUN};
EnumSet.allOf(DAY.class).stream().map(e -> e.name()).collect(Collectors.toList())

EnumSet.allOf(DAY.class).stream().map(DAY::name).collect(Collectors.toList())

我偶然发现此问题的主要原因是我想编写一个通用的验证器,以验证给定的字符串枚举名称对于给定的枚举类型是否有效(如果有人发现有用,则进行共享)。

为了进行验证,我必须使用Apache's EnumUtils库,因为在编译时不知道枚举的类型。

@SuppressWarnings({ "unchecked", "rawtypes" })
public static void isValidEnumsValid(Class clazz, Set<String> enumNames) {
    Set<String> notAllowedNames = enumNames.stream()
            .filter(enumName -> !EnumUtils.isValidEnum(clazz, enumName))
            .collect(Collectors.toSet());

    String validEnumNames = (String) EnumUtils.getEnumMap(clazz).keySet().stream()
            .collect(Collectors.joining(", "));

    if (notAllowedNames.size() > 0) {
        throw new IllegalArgumentException("The requested values '" + notAllowedNames.stream()
                .collect(Collectors.joining(",")) + "' are not valid. Please select one more (case-sensitive) "
                + "of the following : " + validEnumNames);
    }
}

我太懒了,无法编写枚举注释验证器,如此处https://stackoverflow.com/a/51109419/1225551

所示

答案 2 :(得分:0)

枚举:

public enum UserCategory {

    EMPLOYEE_USER("Employee user"),
    CONTRACTOR_USER("Contractor User"),
    THIRD_PARTY_USER("Third-party User");

    private String desc;

    private UserCategory(String desc) {
        this.desc = desc;
    }
}

以数组形式获取值:

  UserCategory.values());

获取值作为列表:

  Arrays.asList(UserCategory.values());