【问题标题】:Convert Java Map Enum keys to Map String keys将 Java Map Enum 键转换为 Map String 键
【发布时间】:2018-02-27 18:38:09
【问题描述】:

我有以下地图:

Map<DataFields, String> myMap;

但我需要将其转换为以下内容:

Map<String, String> myMap;

我什至没有编译的最好的微弱尝试是:

myMap.keySet().stream().map(k -> k.name()).collect(Collectors.toMap(k, v)

【问题讨论】:

  • 我认为您可能需要使用entrySet() 而不是keySet()
  • 不确定 FP 是否会降低效率。另一个答案stackoverflow.com/questions/17208346/…
  • 另外,不知道你为什么需要这样的地图。无论您必须在哪里使用此映射,您都可以有效地将键转换为字符串然后使用。

标签: java dictionary java-8


【解决方案1】:

您需要流式传输entrySet()(因此您拥有键和值),并将它们收集到地图中:

Map<String, String> result =
    myMap.entrySet()
         .stream()
         .collect(Collectors.toMap(e -> e.getKey().name(), e -> e.getValue()));

【讨论】:

  • e -&gt; e.getValue() 替换为Entry::getValue
  • Eugene 这只是一个语法糖。使用Entry::getValue的任何性能优势
  • @AdeshKumar 首先,除非您用@ 标记我,否则我无法告诉您评论,其次是问题还是肯定?
  • 是的,尽可能使用方法引用对性能和可读性都有好处。
  • @AdeshKumar 一个 lambda 表达式将创建一个更多的合成方法,而方法引用不会,这是唯一的区别(除了可读性)
【解决方案2】:

Java 8,简洁的方式(没有流):

Map<String, String> result = new HashMap<>();
myMap.forEach((k, v) -> result.put(k.name(), v));

【讨论】:

    【解决方案3】:
    Map<String, String> result = myMap
        .entrySet() // iterate over all entries (object with tow fields: key and value)
        .stream() // create a stream
        .collect(Collectors.toMap(e -> e.getKey().toString(), e -> e.getValue()));
            // collect to map: convert enum Key value toString() and copy entry value
    

    【讨论】:

    • 我更喜欢使用name() 而不是toString(),这就是我接受其他答案的原因。
    【解决方案4】:

    没有收集器助手的另一种方法。使用entryset 将使其非常容易映射。

      map.entrySet()
                    .stream()
                    .collect(
                            () -> new HashMap<String, String>(),
                            (Map newMap, Map.Entry<DataFields, String> entry) -> {
                                newMap.put(entry.getKey().name(), entry.getValue());
                            }
                            ,
                            (Map map1, Map map2) -> {
                                map.putAll(map2);
                            }
                    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-29
      • 2013-05-24
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 2018-09-06
      相关资源
      最近更新 更多