[java] 열거 형의 모든 이름을 String []으로 가져 오기

열거 형 요소의 이름을 Strings 배열로 얻는 가장 쉽고 짧은 방법은 무엇입니까?

이것이 의미하는 바는 예를 들어 다음 열거 형이있는 경우입니다.

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

    public static String[] names() {
        // ...
    }
}

names()방법은 배열을 반환합니다 { "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }.



답변

다음은 모든 enum수업에 대한 한 줄짜리입니다 .

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

Pre Java 8은 덜 우아하지만 여전히 한 줄입니다.

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

다음과 같이 호출합니다.

String[] names = getNames(State.class); // any other enum class will work

하드 코딩 된 enum 클래스에 대해 간단한 것을 원한다면 :

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


답변

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


답변

Apache Commons Lang 3을 사용하는 우아한 솔루션은 다음과 같습니다.

EnumUtils.getEnumList(State.class)

목록을 반환하지만 목록을 쉽게 변환 할 수 있습니다. list.toArray()


답변

Java 8을 사용할 수 있다면 잘 작동합니다 (Yura의 제안에 대한 대안으로 더 효율적).

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


답변

Java 8 사용 :

Arrays.stream(MyEnum.values()).map(Enum::name)
                    .collect(Collectors.toList()).toArray();


답변

나는 이것을 이렇게 쓸 것이다

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


답변

다음과 같이하면됩니다.

public static String[] names() {
  String[] names = new String[values().length];
  int index = 0;

  for (State state : values()) {
    names[index++] = state.name();
  }

  return names;
}

문서 는 대부분의 경우 toString()대신 사용 을 권장name() 하지만 여기에서 이름을 명시 적으로 요청했습니다.