首页 > 解决方案 > 将一组地图流式传输到一个地图中

问题描述

我有一组地图。内部映射可以有匹配的键,所以我想把它变成 a Mapof Collection

Collection<Map<String, Thing>>=>Map<String, Collection<Thing>>

我试过的是:

Map<String, Collection<Thing>> newMap = oldCollection
    .stream()
    .map(Map::entrySet)
    .collect(Collectors.groupingBy(
             Entry::getKey,
             Collectors.mapping(Entry::getValue, Collectors.toList())));

我觉得这应该可以工作,但我得到一个编译错误:

Type mismatch: cannot convert from Map<Object,List<Object>> to Map<String,Collection<Thing>>

有谁知道我做错了什么?

标签: javadictionaryjava-8java-streamcollectors

解决方案


oldCollection.stream().map(Map::entrySet)创建一个Stream<Set<Map.Entry<String,Thing>>>,但你需要一个Stream<Map.Entry<String,Thing>>.

因此,您需要使用flatMap

Map<String, List<Thing>>
    newMap = oldCollection.stream()
                          .flatMap(m->m.entrySet().stream())
                          .collect(Collectors.groupingBy(Map.Entry::getKey, 
                                                         Collectors.mapping(Map.Entry::getValue,
                                                                            Collectors.toList())));

此外,由于您将分组值映射到 a List,因此输出类型应该是Map<String, List<Thing>>

如果要保留当前的输出类型,可以更改Collectors.toList()为。Collectors.toCollection(ArrayList::new)


推荐阅读