【问题标题】:Converting a Map<String,Map<String,Integer>> to Map<String,Integer> using streams使用流将 Map<String,Map<String,Integer>> 转换为 Map<String,Integer>
【发布时间】:2019-12-06 15:28:55
【问题描述】:

我想使用Streams 将Map&lt;String,Map&lt;String,Integer&gt;&gt; 转换为Map&lt;String,Integer&gt;

这就是问题所在(以及为什么我似乎无法弄清楚):

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

我有这样的条目:

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 类和summingIntgroupingBy 等方法,您应该能够做到这一点。不过,我似乎无法找出解决此问题的正确方法。

需要注意的是,所有内部的Maps 都保证始终具有相同的键,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())));
                });

但是求和部分怎么加呢?

【问题讨论】:

  • 你不能有这4个条目,键是一样的,只有2个
  • @AndrewTobilko 我相信OP意味着键“A”的内部映射有两个条目,键“B”的内部映射也是如此
  • 正确。内层映射相同,但它们是不同的映射,因为它们位于外层映射的不同条目中

标签: java java-8 hashmap java-stream collectors


【解决方案1】:

这应该可行:

首先创建所有内部映射的条目Stream,然后将条目按key分组并将具有相同key的值相加。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2022-09-30
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多