在 Java 8 中获取枚举值作为字符串列表

Get enum values as List of String in Java 8

是否有任何 Java 8 方法或简单方法,其中 returns 枚举值作为字符串列表,如:

List<String> sEnum = getEnumValuesAsString();

你可以做到(pre-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());

你也可以按照下面的方式做

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());

    if (notAllowedNames.size() > 0) {
        String validEnumNames = (String) EnumUtils.getEnumMap(clazz).keySet().stream()
            .collect(Collectors.joining(", "));

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

我懒得写一个枚举注释验证器,如下所示