Получение всех имен в перечислении в виде строки []
Какой самый простой и/или самый короткий способ получить имена элементов перечисления в виде массива String
s?
Я имею в виду, что если бы, например, у меня было следующее перечисление:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
public static String[] names() {
// ...
}
}
метод names()
возвращает аналоговый массив с { "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }
.
Ответы
Ответ 1
Обновление:
В java 8 это одна строка для произвольного класса enum с использованием потока:
public static String[] getNames(Class<? extends Enum<?>> e) {
return Arrays.stream(e.getEnumConstants()).map(Enum::name).toArray(String[]::new);
}
В java 7, немного менее изящный, но этот однострочный трюк делает трюк:
public static String[] names() {
return Arrays.toString(State.values()).replaceAll("^.|.$", "").split(", ");
}
Кроме того, здесь версия этого, которая будет работать для любого перечисления:
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 too
Ответ 2
Создайте массив String[]
для имен и вызовите статический метод values()
, который возвращает все значения перечисления, затем перебирает значения и заполняет массив имен.
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;
}
Ответ 3
Если вы можете использовать Java 8, это работает хорошо (альтернатива предложению Yura, более эффективная):
public static String[] names() {
return Stream.of(State.values()).map(State::name).toArray(String[]::new);
}
Ответ 4
Вот элегантное решение, использующее Apache commons-lang3:
EnumUtils.getEnumList(State.class)
Хотя он возвращает список, вы можете легко преобразовать список с помощью list.toArray()
Ответ 5
С помощью java 8:
Arrays.stream(MyEnum.values()).map(Enum::name)
.collect(Collectors.toList()).toArray();
Ответ 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()]);
}
Ответ 7
Что-то вроде этого:
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()
в большинстве случаев, но вы явно указали здесь имя.
Ответ 8
Мое решение, с манипуляцией строками (не самым быстрым, но компактным):
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
public static String[] names() {
String valuesStr = Arrays.toString(State.values());
return valuesStr.substring(1, valuesStr.length()-1).replace(" ", "").split(",");
}
}
Ответ 9
Другие способы:
Первый
Arrays.asList(FieldType.values())
.stream()
.map(f -> f.toString())
.toArray(String[]::new);
Другой способ
Stream.of(FieldType.values()).map(f -> f.toString()).toArray(String[]::new);
Ответ 10
Я сделал бы это так (но я бы, вероятно, сделал имена немодифицируемым набором вместо массива):
import java.util.Arrays;
enum State {
NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;
public static final String[] names=new String[values().length];
static {
State[] values=values();
for(int i=0;i<values.length;i++)
names[i]=values[i].name();
}
}
public class So13783295 {
public static void main(String[] args) {
System.out.println(Arrays.asList(State.names));
}
}
Ответ 11
У меня такая же потребность и используйте общий метод (внутри класса ArrayUtils):
public static <T> String[] toStringArray(T[] array) {
String[] result=new String[array.length];
for(int i=0; i<array.length; i++){
result[i]=array[i].toString();
}
return result;
}
И просто определите STATIC внутри enum...
public static final String[] NAMES = ArrayUtils.toStringArray(values());
Java перечисления действительно пропускают методы names() и get (index), они действительно полезны.
Ответ 12
обычный способ (каламбур):
String[] myStringArray=new String[EMyEnum.values().length];
for(EMyEnum e:EMyEnum.values())myStringArray[e.ordinal()]=e.toString();
Ответ 13
Я немного тестировал решение @Bohemian. Производительность лучше при использовании наивного цикла.
public static <T extends Enum<?>> String[] getEnumNames(Class<T> inEnumClass){
T [] values = inEnumClass.getEnumConstants();
int len = values.length;
String[] names = new String[len];
for(int i=0;i<values.length;i++){
names[i] = values[i].name();
}
return names;
}
//Bohemian solution
public static String[] getNames(Class<? extends Enum<?>> e) {
return Arrays.stream(e.getEnumConstants()).map(Enum::name).toArray(String[]::new);
}
Ответ 14
Если вы хотите кратчайший, вы можете попробовать
public static String[] names() {
String test = Arrays.toString(values());
return text.substring(1, text.length()-1).split(", ");
}
Ответ 15
Просто мысль: возможно, вам не нужно создавать метод для возврата значений enum в виде массива строк.
Зачем вам нужен массив строк? Возможно, вам нужно только преобразовать значения, когда вы их используете, если вам когда-нибудь понадобится это сделать.
Примеры:
for (State value:values()) {
System.out.println(value); // Just print it.
}
for (State value:values()) {
String x = value.toString(); // Just iterate and do something with x.
}
// If you just need to print the values:
System.out.println(Arrays.toString(State.values()));
Ответ 16
Попробуй это:
public static String[] vratAtributy() {
String[] atributy = new String[values().length];
for(int index = 0; index < atributy.length; index++) {
atributy[index] = values()[index].toString();
}
return atributy;
}
Ответ 17
org.apache.commons.lang3.EnumUtils.getEnumMap(State.class).keySet()
Ответ 18
Другой способ сделать это в Java 7 или более ранней версии - использовать Guava:
public static String[] names() {
return FluentIterable.from(values()).transform(Enum::name).toArray(String.class);
}
Ответ 19
Просто используйте: List<Something> somethingList = Arrays.asList(Something.values());