Java:如何将String ArrayList分配给List

问题描述 投票:2回答:3

我有一个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上做一个循环并逐个添加。

java list enums
3个回答
1
投票

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

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方法之前完成)


0
投票

你可以这样做:

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

它适用于任何枚举类型。


0
投票

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

List<MyEnum> myenums = stringList
        .stream()
        .map(MyEnum::valueOf)
        .collect(Collectors.toList());
© www.soinside.com 2019 - 2024. All rights reserved.