将枚举中的所有名称作为String []

Kon*_*tin 91 java arrays enums

将枚举元素的名称作为Strings 数组的最简单和/或最短的方法是什么?

我的意思是,例如,如果我有以下枚举:

public enum State {
    NEW,
    RUNNABLE,
    BLOCKED,
    WAITING,
    TIMED_WAITING,
    TERMINATED;

    public static String[] names() {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

names()方法将返回一个类似的数组{ "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }.

Boh*_*ian 84

更新:

在java 8中,它是使用流的任意枚举类的一行:

public static String[] getNames(Class<? extends Enum<?>> e) {
    return Arrays.stream(e.getEnumConstants()).map(Enum::name).toArray(String[]::new);
}
Run Code Online (Sandbox Code Playgroud)

在java 7中,有点不那么优雅,但是这个单线程可以解决问题:

public static String[] getNames(Class<? extends Enum<?>> e) {
    return Arrays.toString(e.getEnumConstants()).replaceAll("^.|.$", "").split(", ");
}
Run Code Online (Sandbox Code Playgroud)

此外,这是一个适用于任何枚举的版本:

String[] names = getNames(State.class); // any other enum class will work
Run Code Online (Sandbox Code Playgroud)

你会这样称呼:

public static String[] names() {
    return Arrays.toString(State.values()).replaceAll("^.|.$", "").split(", ");
}
Run Code Online (Sandbox Code Playgroud)

  • 到了'Arrays.toString(State.values())` (8认同)
  • 不是最快的工作方式,但很好的正则表达式. (2认同)
  • 在Java 8解决方案中,在方法范围之外,您可以使用`YourEnumName.values()来代替`e.getEnumConstants()`. (2认同)

Per*_*ror 62

String[]为名称创建一个数组并调用values()返回所有枚举值的静态方法,然后遍历这些值并填充names数组.

public static String[] names() {
    State[] states = values();
    String[] names = new String[states.length];

    for (int i = 0; i < states.length; i++) {
        names[i] = states[i].name();
    }

    return names;
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么要调用`values()`13次,每次都生成一个新数组,而不是将数组缓存在局部变量中?为什么使用toString(),它是可覆盖的,而不是`name()`? (9认同)
  • 您仍然没有返回名称,而是返回toString()值. (2认同)

Ser*_*llo 12

这是使用Apache commons-lang3的优雅解决方案:

EnumUtils.getEnumList(State.class)
Run Code Online (Sandbox Code Playgroud)

虽然它返回一个List,但您可以使用list.toArray()轻松转换列表

  • `EnumUtils.getEnumList(enumClass)`返回枚举值,而不是字符串.您可以使用`EnumUtils.getEnumMap(enumClass).keySet()`,但顺序可能不同. (5认同)

Kri*_*oyd 10

如果你可以使用Java 8,这很好用(替代Yura的建议,效率更高):

public static String[] names() {
    return Stream.of(State.values()).map(State::name).toArray(String[]::new);
}
Run Code Online (Sandbox Code Playgroud)


小智 9

用java 8:

Arrays.stream(MyEnum.values()).map(Enum::name)
                    .collect(Collectors.toList()).toArray();
Run Code Online (Sandbox Code Playgroud)

  • 虽然它可能有效,但这种实现效率很低,首先创建一个ArrayList,添加所有元素,然后创建一个数组并再次复制所有内容. (2认同)

Ray*_*non 6

我会这样写的

public static String[] names() {

    java.util.LinkedList<String> list = new LinkedList<String>();
    for (State s : State.values()) {
        list.add(s.name());
    }

    return list.toArray(new String[list.size()]);
}
Run Code Online (Sandbox Code Playgroud)