[英]Java stream collect to Map<String, Map<Integer, MyObject>>
[英]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.