在一个枚举中获取所有名字作为一个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());