要映射的地图流

时间:2014-11-05 08:49:50

标签: java lambda java-8 java-stream

如何在Java 8中将StreamMap(相同类型)压缩为单个Map

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

2 个答案:

答案 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,这意味着如果您重复键,则不会保证将是最终值。