我有一个Enum类,其中每个Enum都有一个String值。
我想用List中的Enum类型创建一个List <>。这里的字符串是枚举的值。
是否可以在初始化期间直接分配它们?如果是,那么最好的方法是什么?
这是一个示例代码:
public class SomeController {
public enum MyEnum {
A("a"),
B("b"),
C("c");
private final String value;
MyEnum(String value) {
this.value = value;
}
}
public String handler(
@RequestParam(name = "enumList") List<MyEnum> myEnumList ) {
//do something with myEnumList
return "something";
}
}
附:我需要直接将String-list分配给MyEnum-list,如上所示。我不能在String-list上做一个循环并逐个添加。
首先在枚举中创建所有枚举常量的映射:
private static final Map<String, MyEnum> CONSTANTS = Arrays.stream(values())
.collect(Collectors.toMap(e -> e.value, e -> e));
然后在枚举中使用@JsonCreator
创建一个查找方法:
@JsonCreator
public static MyEnum fromValue(String value) {
MyEnum myEnum = CONSTANTS.get(value);
if(myEnum == null) {
throw new NoSuchElementException(value);
}
return myEnum;
}
杰克逊将检测json创建者方法并使用它将你的字符串列表转换为枚举列表(这一切都在进入你的handler
方法之前完成)
你可以这样做:
public static <T extends Enum<T>> List<T> toEnumList(
Iterable<String> strings, Class<T> clazz) {
List<T> result = new ArrayList<>();
for (String s : strings) {
result.add(Enum.valueOf(clazz, s));
}
return result;
}
它适用于任何枚举类型。
如果您使用Java 8并且stringList包含枚举的名称;
List<MyEnum> myenums = stringList
.stream()
.map(MyEnum::valueOf)
.collect(Collectors.toList());