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

Sug*_*lai 45 java enums java-8

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

List<String> sEnum = getEnumValuesAsString();
Run Code Online (Sandbox Code Playgroud)

Kon*_*kov 114

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

List<Enum> enumValues = Arrays.asList(Enum.values());
Run Code Online (Sandbox Code Playgroud)

要么

List<Enum> enumValues = new ArrayList<Enum>(EnumSet.allOf(Enum.class));
Run Code Online (Sandbox Code Playgroud)

使用Java8功能,您可以将每个常量映射到它的名称:

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

  • @kocko:这太过于简单化了.对于少量数据,流通常比数组的开销小,并且使用`parallel`可以显着地影响性能; 并行化的成本并不总是胜过胜利. (12认同)
  • 您还可以使用`Stream.of`或`Arrays.stream`稍微缩短`asList(...).stream()`. (6认同)
  • 要将名称连接到一个字符串以便您可以记录它们,请使用`.collect(Collectors.joining(","))`替换收集器. (6认同)
  • 第一个和第二个解决方案并没有真正解决问题,因为OP要求输入字符串数组.那么流是唯一可行的解​​决方案? (3认同)

Raf*_*Raf 7

您也可以执行以下操作

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

或者

EnumSet.allOf(DAY.class).stream().map(DAY::name).collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

我偶然发现这个问题的主要原因是我想编写一个通用验证器来验证给定的字符串枚举名称对于给定的枚举类型是否有效(共享以防有人觉得有用)。

为了验证,我不得不使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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