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

106

有没有Java 8方法或易于的方式,可以将枚举值作为字符串列表返回,例如:

List<String> sEnum = getEnumValuesAsString();

1
将枚举值作为字符串获取意味着什么?您想要枚举常量名称的列表吗? - user2357112
@user2357112,将值作为“字符串列表”。 - Suganthan Madhavan Pillai
那不是回答这个问题的方法。枚举值不是字符串。 - user2357112
1
你能展示一下如何在没有Java 8的情况下完成这个任务吗? - Radiodef
2
@user2357112 我同意,枚举值不是字符串,它有自己的类型,但我需要进行转换。 - Suganthan Madhavan Pillai
3个回答

223

您可以在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
不使用流反而会降低性能,因为流可以并行处理。 - Konstantin Yovkov
8
您可以通过使用 Stream.ofArrays.stream 来稍微缩短 asList(...).stream() 的写法。 - Radiodef
19
@kocko说的有点过于简单了。对于少量的数据,流通常会比数组多一些开销,并且使用parallel可以显著地降低性能;并行化操作有一个代价,并不总是能够抵消它所带来的收益。 - Louis Wasserman
4
第一和第二种解决方案并不能真正解决问题,因为OP要求将结果作为字符串数组返回。那么流是唯一可行的解决方案吗? - kikovi
6
将名称连接成一个字符串以便记录它们,可以将收集器替换为.collect(Collectors.joining(", ")) - Noumenon
显示剩余3条评论

13

你也可以按照以下方式进行操作

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的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://dev59.com/lGMl5IYBdhLWcg3wr4rn#51109419


0
如果你需要访问一个数组,可以这样做:
public enum DAY {MON, TUES, WED, THU, FRI, SAT, SUN};

String[] days = Stream.of(DAY.values()).map(Enum::name).toArray(String[]::new);

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