Java 地图流

Java 地图流,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,在Java8中,如何将映射s(相同类型)的流展平为单个映射 Map<String, Long> toMap(Stream<Map<String, Long>> stream) { return stream. ??? } Map-toMap(流){ 返回流??? } 我的语法可能有点错误,但flatMap应该可以为您完成大部分工作: Map<String, Long> toMap(Stream<Map<String, Long

在Java8中,如何将
映射
s(相同类型)的
展平为单个
映射

Map<String, Long> toMap(Stream<Map<String, Long>> stream) {
    return stream. ???
}
Map-toMap(流){
返回流???
}

我的语法可能有点错误,但flatMap应该可以为您完成大部分工作:

Map<String, Long> toMap(Stream<Map<String, Long>> stream) {
    return stream.flatMap (map -> map.entrySet().stream()) // this would create a flattened
                                                           // Stream of all the map entries
                 .collect(Collectors.toMap(e -> e.getKey(),
                                           e -> e.getValue())); // this should collect
                                                               // them to a single map
}
Map-toMap(流){
return stream.flatMap(map->map.entrySet().stream())//这将创建一个展平的
//所有地图条目的流
.collect(Collectors.toMap(e->e.getKey(),
e->e.getValue());//这应该会收集
//把它们放在一张地图上
}

我想提出一个使用的解决方案,这对我来说更直观。不过我会在线使用它

Map<String, Long> toMap(Stream<Map<String, Long>> stream) {
    return stream.reduce(new HashMap<>(), Util::reduceInto);
}
Map-toMap(流){
return stream.reduce(新的HashMap(),Util::reduceInto);
}
在Util.java中:

public static <R, T> Map<R, T> reduceInto(Map<R, T> into, Map<R, T> valuesToAdd) {
    reduceInto.putAll(valuesToAdd);
    return reduceInto;
}
public static Map reduceInto(映射到,映射值添加){
还原为putAll(值添加);
返回还原到;
}
在本例中,reduceInto()适用于任何类型的映射,并使用可变性来避免为流的每个项创建新映射


重要:尽管此方法允许在流中重复键,但reduceInto()不是,这意味着如果您有重复键,则无法保证哪一个是最终值。

方法流()对于类型未定义Map@DariuszMydlarz我修正了答案。改为使用map.entrySet().stream()。可以使用方法引用:
Collectors.toMap(map.Entry::getKey,map.Entry::getValue)
(或者如果导入嵌套类:
Collectors.toMap(Entry::getKey,Entry::getValue)
),请注意,如果同一个键多次出现,双参数
toMap(…)
将引发异常。如果这不是您想要的,请使用3参数
toMap(…)
。使用
(a,b)->b
作为第三个参数来模拟
Map::addAll
(后面的值覆盖前面的值)。如果值为null,则此操作无效。此外,如果贴图具有冲突的键,则会出现合并异常。这里给出的方法更好