【问题标题】:Easiest way to get Enum in to Key Value pair让枚举进入键值对的最简单方法
【发布时间】:2010-03-08 12:11:19
【问题描述】:

我已经这样定义了我的枚举。

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>();

回答:我做了什么

我创建了一个通用方法来访问任何枚举并将值从该枚举更改为映射。我得到了这个想法,形成一个代码片段,可以在任何其他线程中找到。

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

现在,在这之后,我要做的就是使用所有枚举结构调用这个方法,然后我就完成了。

还有一件事

要完成这项工作,我必须像这样 orverride toString 方法

    public String toString() {
        return name;
    }

谢谢。

【问题讨论】:

  • 你希望枚举还是字符串作为键?
  • 除了那些反射的东西,你可以做klass.getEnumConstants()

标签: java enums


【解决方案1】:

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

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

【讨论】:

  • 这确实是非常困难的方法。不存在开箱即用的东西吗?一定有什么…………
  • @vijay.shad 看到我的更新。如果您在问题中提供更多详细信息,则会增加获得所需内容的机会:-)
  • Java 没有给你更简单的方法...抱歉
  • 一个包含一行的循环(总共三行,如果你使用它们,包括右括号)是“非常困难的方式”吗?
  • 为了澄清:Vijay 的第一条评论是关于我的答案的早期版本,它还没有包含带有循环的第二个解决方案。我相信后一个版本可以满足他的要求。
【解决方案2】:

您可以在枚举上使用 values() 方法,为您提供所有可能的组合,然后使用迭代器将其放入映射中。

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

【讨论】:

    【解决方案3】:

    Java 8 方式:

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

    可以理解地将其存储在变量中:)

    【讨论】:

      【解决方案4】:

      我认为在地图中使用 Enum 作为键的最简单方法是使用 EnumMap http://download.oracle.com/javase/1,5.0/docs/api/java/util/EnumMap.html

      【讨论】:

        【解决方案5】:

        您可以使用 EnumMap,它是一个专门将 Enum 作为其键的 Map 实现。

        EnumMap<UserType, String> activityMap = new EnumMap<>(UserType.class);
        

        但是,EnumMap 需要构造函数中的键类型。

        参考:https://www.baeldung.com/java-enum-map

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-17
          • 1970-01-01
          • 2011-10-20
          • 2014-03-08
          • 2014-12-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多