Java 8流聚合地图

费拉斯

我正在尝试做看似简单的事情,但到目前为止还没有运气。我有一个Map列表,它们来自并行的一堆CompletableFutures,然后必须将结果合并。由于映射中的键是唯一的,因此In需要合并值并生成与SomeType组合列表关联的唯一键的新映射。例如:

Map1:key1:Sometype1 key2:Sometype2

Map2 key1:Sometype3 key2:Sometype4

所需的最终结果:Map3:key1:Sometype,Sometype3 key2:Sometype2,Sometype4

我尝试使用groupBy和其他方法,但是似乎大多数方法都假定使用List而不是Map开头,因此我无法找到一种简单的方法。

到目前为止,我有类似的东西:

 Map<String, List<Sometype>> volPercent = waitGroup.stream()
            .map(CompletableFuture::join)
            .flatMap((e) -> e.entrySet().stream())
            .collect(Collectors.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>
斯图尔特·马克斯

我假设您是从地图流开始的:

Stream<Map<String, Sometype>> input = ... ;

您进行的平面布置和收集工作已走得很远。但是,您尝试过的代码

    input.flatMap(map -> map.entrySet().stream())
         .collect(Collectors.groupingBy(Map.Entry::getKey));

为您提供了一个地图,该地图的键是String并且其值是地图列表,特别是List<Map.Entry<String,Sometype>>,而不是List<Sometype>您想要的。您要做的就是在按键对收集器进行分组之后,使用收集器的“下游”功能。您要获取每个Map.Entry并将其提取(映射)为其值,即Sometype这是由mapping收集器完成的

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

最终代码如下所示:

Map<String, List<Sometype>> result =
    input.flatMap(map -> map.entrySet().stream())
         .collect(groupingBy(Map.Entry::getKey,
                             mapping(Map.Entry::getValue,
                                     toList())));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章