如何在Java 8中将Stream
个Map
(相同类型)压缩为单个Map
?
Map<String, Long> toMap(Stream<Map<String, Long>> stream) {
return stream. ???
}
答案 0 :(得分:16)
我的语法可能有些偏差,但是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
}
答案 1 :(得分:0)
我想使用reduce()提出一个解决方案,对我来说更直观。我会内联使用它。
Map<String, Long> toMap(Stream<Map<String, Long>> stream) {
return stream.reduce(new 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;
}
在这种情况下,reduceInto()可用于任何类型的地图,并使用可变性来避免为Stream的每个项目创建新的地图。
重要:尽管此方法允许流中重复键,但reduceInto()不允许 associative,这意味着如果您重复键,则不会保证将是最终值。