使用流将 Map<String,Map<String,Integer>> 转换为 Map<String,Integer>

Converting a Map<String,Map<String,Integer>> to Map<String,Integer> using streams

我想使用 StreamMap<String,Map<String,Integer>> 转换为 Map<String,Integer>

关键在于(以及为什么我似乎无法理解):

我想按相应地图的键值对我的整数值进行分组。所以,澄清一下:

我有这样的条目:

Entry 1: ["A",["a",1]]

Entry 2: ["B",["a",2]]

Entry 3: ["B",["b",5]]

Entry 4: ["A",["b",0]]

我想将该结构转换为以下结构:

Entry 1: ["a",3]

Entry 2: ["b",5]

我认为使用 Collectors class 以及 summingIntgroupingBy 等方法您应该能够完成此任务。不过,我似乎想不出解决这个问题的正确方法。

需要注意的是,所有内部 Map 都保证始终具有相同的键,或者 Integer-value 0 或者 sth > 0。(例如 "A"并且 "B" 将始终拥有相同的 5 个键) 到目前为止我尝试过的一切几乎都没有结束。我知道,如果没有求和部分,我可以这样处理:

Map<String,Integer> map2= new HashMap<String,Integer>();
                map1.values().stream().forEach(map -> {
                    map2.putAll(map.entrySet().stream().collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue())));
                });

但是求和部分怎么加呢?

这应该有效:

首先创建一个Stream所有内部映射的条目,然后将条目按键分组并对具有相同键的值求和。

Map<String,Integer> map2 = 
    map1.values()
       .stream()
       .flatMap(m -> m.entrySet().stream()) // create a Stream of all the entries 
                                            // of all the inner Maps
       .collect(Collectors.groupingBy(Map.Entry::getKey,
                                      Collectors.summingInt(Map.Entry::getValue)));