Fer*_*ras 4 java lambda java-8 java-stream
我试图做一些看似直截了当的事情但到目前为止没有运气.我有一个Map列表,它们来自一堆并行的CompletableFutures,结果必须加入.由于映射中的键是唯一的,因此需要合并值并生成与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());
Run Code Online (Sandbox Code Playgroud)
我不确定的部分是什么需要分组.我尝试了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>
Run Code Online (Sandbox Code Playgroud)
我假设你是从一组地图开始的:
Stream<Map<String, Sometype>> input = ... ;
Run Code Online (Sandbox Code Playgroud)
你在平面图和收集方面走得很远.但是,你试过的代码,
input.flatMap(map -> map.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey));
Run Code Online (Sandbox Code Playgroud)
为您提供一个地图,其键是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())));
Run Code Online (Sandbox Code Playgroud)