【问题标题】:Get enum values as List of String in Java 8在 Java 8 中获取枚举值作为字符串列表
【发布时间】:2015-06-10 12:51:57
【问题描述】:

是否有任何 Java 8 方法或简单方法,将枚举值作为字符串列表返回,例如:

List<String> sEnum = getEnumValuesAsString();

【问题讨论】:

  • 将枚举值作为字符串获取意味着什么?你想要枚举常量的名称列表吗?
  • @user2357112,值为list of String
  • 这不能回答问题。枚举值不是字符串。
  • 您能否展示在没有 Java 8 的情况下如何做到这一点?
  • @user2357112 我同意,枚举值不是字符串,它是自己的类型,但我需要转换

标签: java enums java-8


【解决方案1】:

您可以这样做(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());

【讨论】:

  • 没有。使用 Streams 实际上可以提高性能,因为它可以并行处理。
  • 您也可以使用Stream.ofArrays.stream 稍微缩短asList(...).stream()
  • @kocko:这过于简单化了。对于少量数据,流的开销通常比数组小,使用parallel 会显着损害性能;并行化的成本并不总是被胜利所抵消。
  • 第一个和第二个解决方案并不能真正解决问题,因为 OP 要求字符串数组作为结果。那么流是唯一可行的解​​决方案吗?
  • 要将名称连接成一个字符串以便记录它们,请将收集器替换为.collect(Collectors.joining(", "))
【解决方案2】:

你也可以这样做

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

我懒得写一个枚举注解验证器,如下所示https://stackoverflow.com/a/51109419/1225551

【讨论】:

    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多