在一个枚举中获取所有名字作为一个String

什么是最简单和/或最短的方式可以获得枚举元素的名称作为一个String数组?

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

 public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; public static String[] names() { // ... } } 

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

更新:

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

 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 

为名称创build一个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; } 

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

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

这是一个使用Apache commons-lang3的优雅解决scheme:

 EnumUtils.getEnumList(State.class) 

虽然它返回一个列表,你可以轻松地使用list.toArray()

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

文档build议在大多数情况下使用toString()而不是name() ,但是您已经明确地在这里询问了名称。

我的解决scheme,与string操作(不是最快,但是紧凑):

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

我会这样做(但我可能会使名称一个不可修改的集合,而不是一个数组):

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

我有相同的需求,并使用一个通用的方法(在一个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 …

 public static final String[] NAMES = ArrayUtils.toStringArray(values()); 

Java枚举真的错过了一个names()和get(index)方法,它们真的很有帮助。

普通的方式(双关意图):

 String[] myStringArray=new String[EMyEnum.values().length]; for(EMyEnum e:EMyEnum.values())myStringArray[e.ordinal()]=e.toString(); 

我在@波希米亚的解决scheme上做了一些testing。 使用朴素循环时,性能会更好。

 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's solution public static String[] getNames(Class<? extends Enum<?>> e) { return Arrays.stream(e.getEnumConstants()).map(Enum::name).toArray(String[]::new); } 

另一种方法:

第一

 Arrays.asList(FieldType.values()) .stream() .map(f -> f.toString()) .toArray(String[]::new); 

另一种方式

 Stream.of(FieldType.values()).map(f -> f.toString()).toArray(String[]::new); 

如果你想最短,你可以尝试

 public static String[] names() { String test = Arrays.toString(values()); return text.substring(1, text.length()-1).split(", "); } 

只是一个想法:也许你不需要创build一个方法来返回枚举的值作为一个string数组。

为什么你需要string的数组? 也许你只需要在使用它们的时候转换这些值,如果你需要的话。

例子:

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

尝试这个:

 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; 
 EnumUtils.getEnumMap(State.class).keySet() 

简单地使用: List<Something> somethingList = Arrays.asList(Something.values());