열거 형 요소의 이름을 String
s 배열로 얻는 가장 쉽고 짧은 방법은 무엇입니까?
이것이 의미하는 바는 예를 들어 다음 열거 형이있는 경우입니다.
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()
하지만 여기에서 이름을 명시 적으로 요청했습니다.