Java 通过求和值将贴图列表合并到单个贴图中
我有一个阶级价值观:Java 通过求和值将贴图列表合并到单个贴图中,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个阶级价值观: public class Values { private int count; private int values; } 以及类型为Map 我正试图使用Streams API实现这一点,但我被卡住了: public static Map<String, Values> mergeMaps(List<Map<String, Values>> maps) { return maps.stream()
public class Values {
private int count;
private int values;
}
以及类型为Map
我正试图使用Streams API实现这一点,但我被卡住了:
public static Map<String, Values> mergeMaps(List<Map<String, Values>> maps) {
return maps.stream()
.flatMap(m -> m.entrySet().stream()) ...?
}
公共静态地图合并地图(列表地图){
返回maps.stream()
.flatMap(m->m.entrySet().stream())。。。?
}
我如何根据每个条目的键对其进行分组,并将每个计数和每个值添加到单个映射中
提前感谢。您可以使用带有合并功能的
toMap
收集器收集流的条目
public static Map<String, Values> mergeMaps(List<Map<String, Values>> maps) {
return maps.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(v1,v2) -> new Values(v1,v2)));
}
还有一个groupingBy解决方案:
Map<String, Optional<Values>> collect = list.stream()
.flatMap(map -> map.entrySet().stream())
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue,
reducing((v1, v2) -> new Values(v1.count + v2.count, v1.values + v2.values)))));
Map collect=list.stream()
.flatMap(map->map.entrySet().stream())
.collect(groupby)(Map.Entry::getKey,mapping)(Map.Entry::getValue,
减少((v1,v2)->新值(v1.count+v2.count,v1.Values+v2.Valuesщщ));
注意:此映射的值是可选的。
如果源映射之一上有null
值,如map2.put(“ddd”,null)代码>
它允许避免NullPointerException
并返回可选。空的关于两个值
表示(v1,v2)->新值(v1,v2)
的构造函数,我怀疑拥有这样一个构造函数有多好。如果确实存在这种情况,那么调用Values::new
会更干净。虽然在我看来,使用静态方法添加这些属性并返回值
应该是一个更好的选择。
public static Map<String, Values> mergeMaps(List<Map<String, Values>> maps) {
return maps.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(v1,v2) -> new Values(v1,v2)));
}
(v1,v2) -> new Values(v1.getCount()+v2.getCount(),v1.getValue()+v2.getValue())
Map<String, Optional<Values>> collect = list.stream()
.flatMap(map -> map.entrySet().stream())
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue,
reducing((v1, v2) -> new Values(v1.count + v2.count, v1.values + v2.values)))));