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