繁体   English   中英

收集 Map<string, integer> 来自 Map 的 stream <string, map<string, integer> &gt;</string,></string,>

[英]Collect Map<String, Integer> from stream of Map<String, Map<String, Integer>>

我有一个嵌套的 map,键作为员工姓名,值作为另一个 map,键作为公司名称,值作为多年经验,如下所示

Map<String, Map<String, Integer>> map = new HashMap<>();
    Map<String, Integer> innerMap1 = new HashMap<>();
    innerMap1.put("INfosys", 2);
    innerMap1.put("Volvo", 2);
    innerMap1.put("MH", 3);
    innerMap1.put("Piterion", 1);

    Map<String, Integer> innerMap2 = new HashMap<>();
    innerMap2.put("Tata", 2);
    innerMap2.put("Bosch", 1);
    innerMap2.put("Amber", 1);
    innerMap2.put("E2", 1);

    map.put("Rahul", innerMap1);
    map.put("Amrita", innerMap2);

现在我的 function 应该返回一个 Map,其中员工姓名为键,总经验为值。 如何使用 java 流(在单个流中)做到这一点

public Map<String, Integer> getEmployeesWithExp(Map<String, Map<String, Integer>> map) {
    map.entrySet().stream().
                        ...

    return null;
}

可能有多种方法,但您可以将条目collect到新的 map 并将内部映射的值减少为整数,例如像这样:

Map<String, Integer> result = 
           map.entrySet().stream()
              .collect( 
                  Collectors.toMap(e -> e.getKey(), //or Map.Entry::getKey
                                    e -> e.getValue().values().stream()
                                                      .reduce(0, Integer::sum)));

这是我第一次尝试使用带有地图的流,这是一个很好的练习,谢谢。

不过,我只在一个 stream 中没有做到这一点。 该解决方案具有一个主要的 stream 和内部流。

顺便说一句,我使用org.apache.commons.lang3.tuple.Pair

Map<String, Integer> result = map.entrySet().stream()
        .map(entry -> Pair.of(entry.getKey(), entry.getValue().values().stream().reduce(0, Integer::sum)))
        .collect(Collectors.toMap(Pair::getKey, Pair::getValue));

它回答了

 "Amrita" → 5
 "Rahul" → 8

我相信这是正确的。 :D

这对于用于解决方案的循环很简单:-

    Map<String, Integer> finalMap = new HashMap<>();
    for (Entry<String, Map<String, Integer>> entry : map.entrySet()) {
        Integer exp = 0;
        for (Entry<String, Integer> entry2 : entry.getValue().entrySet()) {
            exp += entry2.getValue();
        }
        finalMap.put(entry.getKey(), exp);
    }

输出 - {Amrita=5, Rahul=8}

可以通过简单的方式完成:-

Function< Map<String, Integer>,Integer> sumOfValue = (x) ->   x.values().stream().mapToInt(Integer::intValue).sum(); 
stringMapMap.entrySet().stream().collect(Collectors.toMap(
            e-> e.getKey(), e-> sumOfValue.apply(e.getValue())
    ));    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM