Java:如何将字符串ArrayList分配给列表<;Enum>;

Java:如何将字符串ArrayList分配给列表<;Enum>;,java,list,enums,Java,List,Enums,我有一个Enum类,其中每个Enum都有一个字符串值 我想从列表中创建具有枚举类型的列表。这里的字符串是枚举的值 是否可以在初始化期间直接分配它们?如果是,最好的方法是什么 下面是一个示例代码: public class SomeController { public enum MyEnum { A("a"), B("b"), C("c"); private final String value; My

我有一个Enum类,其中每个Enum都有一个字符串值

我想从列表中创建具有枚举类型的列表。这里的字符串是枚举的值

是否可以在初始化期间直接分配它们?如果是,最好的方法是什么

下面是一个示例代码:

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

}
公共类控制器{
公共枚举髓鞘{
A(“A”),
B(“B”),
C(“C”);
私有最终字符串值;
MyEnum(字符串值){
这个值=值;
}
}
公共字符串处理程序(
@RequestParam(name=“enumList”)列表myEnumList){
//用myEnumList做点什么
返回“某物”;
}
}

p.S.如上所述,我需要直接将字符串列表分配给MyEnum列表。我无法在字符串列表上循环并逐个添加。

首先创建枚举中所有枚举常量的映射:

private static final Map<String, MyEnum> CONSTANTS = Arrays.stream(values())
    .collect(Collectors.toMap(e -> e.value, e -> e));
@JsonCreator
public static MyEnum fromValue(String value) {
   MyEnum myEnum = CONSTANTS.get(value);
   if(myEnum == null) {
       throw new NoSuchElementException(value);
   }
   return myEnum;
}

Jackson将检测json creator方法,并使用它将字符串列表转换为枚举列表(甚至在输入
处理程序
方法之前都会这样做)

以防您使用Java 8,并且如果stringList包含枚举的名称

List<MyEnum> myenums = stringList
        .stream()
        .map(MyEnum::valueOf)
        .collect(Collectors.toList());
List myenums=stringList
.stream()
.map(MyEnum::valueOf)
.collect(Collectors.toList());

您可以执行以下操作:

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;
}
publicstaticlist-toEnumList(
Iterable字符串,类clazz){
列表结果=新建ArrayList();
用于(字符串s:字符串){
结果.添加(枚举值(clazz,s));
}
返回结果;
}

它适用于任何枚举类型。

您将获得什么内容类型以及如何转换它?预期结果是什么?仅当
stringList
包含枚举的
名称时才有效。仅当
strings
包含枚举的
名称时才有效