将枚举转换为键值对的最简单方法

18
我已经像这样定义了我的枚举类型。
public enum UserType {

    RESELLER("Reseller"),

    SERVICE_MANAGER("Manager"),

    HOST("Host");

    private String name;

    private UserType(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

}

如何从枚举值中获取键值对是最简单的方法?

我想要创建的输出映射应该像这样

key   = Enum(example:- HOST)
value = Host

我想定义的地图是:
Map<String, String> constansts = new HashMap<String, String>();

答案:我做了什么

我创建了一个通用方法,用于访问任何枚举并将值更改为Map。我从这里找到的代码片段得到了这个想法,在其他线程中找到。

public static <T extends Enum<T>> Map<String, String> getConstantMap(
        Class<T> klass) {

    Map<String, String> vals = new HashMap<String, String>(0);

    try {
        Method m = klass.getMethod("values", null);
        Object obj = m.invoke(null, null);

        for (Enum<T> enumval : (Enum<T>[]) obj) {
            vals.put(enumval.name(), enumval.toString());
        }

    } catch (Exception ex) {
        // shouldn't happen...
    }

    return vals;
}

现在,我只需要使用所有枚举结构调用此方法,就完成了。
还有一件事:
为了完成这个任务,我必须像这样覆盖toString方法。
    public String toString() {
        return name;
    }

谢谢。

你想要枚举类型还是字符串类型作为键? - Carl
不需要使用反射,你可以直接使用 klass.getEnumConstants() - user102008
6个回答

23

如果您需要从文本值映射到枚举实例:

Map<String, UserType> map = new HashMap<String, UserType>();
map.put(RESELLER.getName(), RESELLER);
map.put(SERVICE_MANAGER.getName(), SERVICE_MANAGER);
map.put(HOST.getName(), HOST);

或者更通用的方法:

for (UserType userType : UserType.values()) {
    map.put(userType.getName(), userType);
}

3
这确实是一条非常艰难的路。难道没有什么别出心裁的方法吗?一定有什么办法…… - vijay.shad
@vijay.shad 看看我的更新。如果你在问题中提供更多细节,你就能增加得到你想要的答案的机会 :-) - Péter Török
重点是:我可能需要回到代码并更新地图;每次在枚举中添加用户类型时。我已经使用枚举来定义我的常量,并希望将它们作为Map访问。 - vijay.shad
@vijay:你为什么需要它作为一个Map?你知道所有枚举都提供的valueOf()方法吗?你想要解决什么问题,而这个问题无法通过UserType.valueOf(someString).getName()来解决呢? - Joachim Sauer
5
澄清一下:Vijay的第一个评论是关于我回答的早期版本,该版本尚未包含带有循环的第二个解决方案。我相信后来的版本符合他的要求。 - Péter Török
显示剩余2条评论

17

Java 8 的方式:

Arrays.stream(UserType.values())
      .collect(Collectors.toMap(UserType::getName, Function.identity()))

可以理解的话,将它存储在一个变量中 :)


14

您可以在枚举上使用values()方法,获取所有可能的组合,并将其放入一个映射中使用迭代器。

Map<String, UserType> map = new HashMap<String, UserType>();
for (UserType userType : UserType.values()) {
    map.put(userType.name(), userType);
}

3

2
你可以使用EnumMap,它是一种Map实现,专门采用枚举作为其键。
EnumMap<UserType, String> activityMap = new EnumMap<>(UserType.class);

然而,EnumMap在构造函数中需要键类型。
参考:https://www.baeldung.com/java-enum-map

0

使用Java 8的Stream API并立即分配到所需的结构中:

HashMap<String, UserType> collect = Arrays.stream(UserType.values())
    .collect(Collectors.toMap(
            UserType::getName,
            Function.identity(),
            (prev, next) -> next, HashMap::new)
    );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接