【问题标题】:How to convert an array of map into a map in JAVA8?如何将地图数组转换为JAVA8中的地图?
【发布时间】:2021-01-19 03:16:47
【问题描述】:

我现在有

Map<String, String>[] map_array= [
{"k":"k1", "v":"v1"},
{"k":"k2", "v":"v2"}
]

如何使用JAVA8流转成

Map<String, String> map = {"k1" : "v1", "k2" : "v2"}

更新: 对不起,我不清楚。 map_array 包含两个映射,每个映射有两个条目,第一个条目是键为“k”,值为“k1”,第二个条目是键为“v”,值为“v1”。现在我试图将它们合并到一个 ImmutableMap 中,键为“k1/k2”,值为“v1/v2”。我现在的实现是可行的,但我想知道 JAVA8 中是否有更清洁的方法。下面是我的实现:

(Map<String, String> m : map_array) {
resault_map.put(m.get("k"), m.get("v"));
}
return result_map;

【问题讨论】:

  • 不清楚map_array的内容是什么。我知道你在你的问题中展示了它,但你的伪代码不是很清楚。就目前而言,您似乎只想知道如何将碰巧存储在数组中的多个映射合并在一起。这个对吗?还是 kv 是该映射中的实际键?
  • 你的意思是map_array中的每张地图都有2个键——kv
  • @Sweeper 正确!刚刚更新了我的问题。

标签: java java-8


【解决方案1】:

似乎数组中的每个映射都代表结果映射中的一个键值对。因此,您可以使用Collectors.toMap,它接受函数 - 一个将数组元素转换为 KVP 的键,另一个将数组元素转换为 KVP 的值:

public static Map<String, String> mapArraysToMap(Map<String, String>[] mapArray) {
    return Arrays.stream(mapArray).collect(Collectors.toMap(
        x -> x.get("k"),
        x -> x.get("v")
    ));
}

这是假设所有数组元素都有一个kv 键。如果在您的场景中可能,您可能希望 filter 排除那些不这样做的人。

【讨论】:

  • 非常感谢!每个数组元素都有一个 k 和 v 键。
【解决方案2】:

您可以循环执行。遍历map_array,然后将它们中的每一个添加到map

像这样:

        Map<String, String> map = new HashMap<>();

        for (Map<String, String> mapFromArray : map_array) {
            map.putAll(mapFromArray);
        }

如果你想使用 Java8 流,你可以使用reduce() 函数。代码将如下所示:

        Map<String, String> map = Arrays.stream(map_array).reduce(new HashMap<>(), (leftMap, rightMap) -> {
            leftMap.putAll(rightMap);
            return leftMap;
        });

【讨论】:

    【解决方案3】:
        Map<String, String> m1 = new HashMap<String, String>();
        m1.put("k1", "v1");
        Map<String, String> m2 = new HashMap<String, String>();
        m2.put("k2", "v2");
        Map<String, String>[] m3 = Arrays.asList(m1, m2).toArray(new Map[0]);
        
        Map<String, String> result  = new HashMap<String, String>();
        Arrays.stream(m3).forEach(m -> result.putAll(m));
        
        System.out.println(result);
    

    结果图就是您要找的。我认为我们可以进一步清理这段代码。但是为了举例,这是代码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      • 2022-11-02
      • 2020-06-30
      相关资源
      最近更新 更多