Java8流聚合映射

Java8流聚合映射,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我试图做一些看起来很难做的事情,但到目前为止运气不好。我有一个地图的列表,它们来自一系列并行的可完成的未来,结果必须合并。由于映射中的键是唯一的,因此需要合并这些值并生成与SomeType的组合列表关联的唯一键的新映射。例如: 地图1: 关键字1:Sometype1 关键字2:Sometype2 Map2 关键字1:某种类型3 关键字2:Sometype4 预期的最终结果: 地图3: 按键1:某种类型,某种类型3 按键2:Sometype2,Sometype4 我尝试使用groupBy和其他方法

我试图做一些看起来很难做的事情,但到目前为止运气不好。我有一个地图的列表,它们来自一系列并行的可完成的未来,结果必须合并。由于映射中的键是唯一的,因此需要合并这些值并生成与SomeType的组合列表关联的唯一键的新映射。例如:

地图1: 关键字1:Sometype1 关键字2:Sometype2

Map2 关键字1:某种类型3 关键字2:Sometype4

预期的最终结果: 地图3: 按键1:某种类型,某种类型3 按键2:Sometype2,Sometype4

我尝试使用groupBy和其他方法,但似乎大多数方法都假设使用列表,而不是地图,因此我无法找到一种简单的方法

到目前为止,我有一些类似于:

 Map<String, List<Sometype>> volPercent = waitGroup.stream()
            .map(CompletableFuture::join)
            .flatMap((e) -> e.entrySet().stream())
            .collect(Collectors.groupingBy());
Map volPercent=waitGroup.stream()
.map(CompletableFuture::join)
.flatMap((e)->e.entrySet().stream())
.collect(收集器.groupingBy());
我不确定的部分是需要按部分分组的内容。我尝试了Map.Entry::getKey,但它无法编译:

Error:(69, 25) java: incompatible types: inference variable T has incompatible bounds
equality constraints: com.Sometype
lower bounds: java.util.Map.Entry<java.lang.String,com.Sometype>
Error:(69,25)java:不兼容类型:推理变量T的边界不兼容
等式约束:com.Sometype
下限:java.util.Map.Entry

问题在于您最初的尝试(据我所知)

收集到
地图

flatMap
之后,有一个
,其元素
groupingBy
映射到
K

但是您需要一个
Map
,因此您需要使用,而不仅仅是一个分类器,这样您还可以将
Map.Entry
映射到
V

差不多

Collectors.groupingBy(
    Map.Entry::getKey,
    Collectors.mapping(
        Map.Entry::getValue,
        Collectors.toList()
    )
)

我假设您从一系列地图开始:

Stream<Map<String, Sometype>> input = ... ;
为您提供一个映射,其键为
String
,其值为映射项列表,特别是
list
,而不是所需的
list
。您需要做的是,在按键对收集器进行分组后,使用收集器的“下游”功能。您希望获取每个
Map.Entry
并将其提取(映射)到其值,即
Sometype
。这是通过
映射
收集器完成的

现在,每个键都可能有几个
Sometype
实例,因此需要将它们收集到一个列表中。这是使用另一个下游收集器完成的,该收集器将它们收集到一个列表中。这是使用熟悉的
toList()
收集器完成的

最后的代码如下所示:

Map<String, List<Sometype>> result =
    input.flatMap(map -> map.entrySet().stream())
         .collect(groupingBy(Map.Entry::getKey,
                             mapping(Map.Entry::getValue,
                                     toList())));
映射结果=
input.flatMap(map->map.entrySet().stream())
.collect(分组方式)(Map.Entry::getKey,
映射(Map.Entry::getValue,
toList());

请为您的问题构造一个可运行的小示例,仅用代码流行很难解决。上游的
CompletableFuture
内容有点分散注意力。未来的问题最好从更明确的输入开始。但我想我能找到答案。
    input.flatMap(map -> map.entrySet().stream())
         .collect(Collectors.groupingBy(Map.Entry::getKey));
Map<String, List<Sometype>> result =
    input.flatMap(map -> map.entrySet().stream())
         .collect(groupingBy(Map.Entry::getKey,
                             mapping(Map.Entry::getValue,
                                     toList())));