【问题标题】:Collect Map<String, Integer> from stream of Map<String, Map<String, Integer>>从 Map<String, Map<String, Integer>> 的流中收集 Map<String, Integer>
【发布时间】:2019-10-14 11:42:14
【问题描述】:

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

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

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

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

    return null;
}

【问题讨论】:

标签: java java-stream collectors


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    顺便说一句,我用的是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

    【讨论】:

      【解决方案3】:

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

          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}

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2019-12-06
          • 1970-01-01
          • 1970-01-01
          • 2017-11-22
          • 2015-07-08
          • 2012-05-17
          • 2012-05-26
          • 2017-03-21
          • 1970-01-01
          相关资源
          最近更新 更多