Java 8流聚合了一个映射
我试图做一些看似直截了当的事情但到目前为止没有运气.我有一个Map列表,它们来自一堆并行的CompletableFutures,结果必须加入.由于映射中的键是唯一的,因此需要合并值并生成与SomeType的组合列表关联的唯一键的新映射.例如:
地图1: MAP2 期望的最终结果: 我尝试使用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.这是通过映射收集器完成的. 现在,您可能为每个键设置了几个Sometype实例,因此您需要将它们收集到列表中.这是使用另一个下游收集器完成的,它将它们收集到一个列表中.这是使用熟悉的toList()收集器完成的. 最终代码如下所示: Map<String,List<Sometype>> result = input.flatMap(map -> map.entrySet().stream()) .collect(groupingBy(Map.Entry::getKey,mapping(Map.Entry::getValue,toList()))); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何使用Java代码配置Logback设置日志级别?
- 详解MyEclipse中搭建spring-boot+mybatis+freemarker框架
- 基于DFA的具有捕获的Java的正则表达式引擎
- java – 在Amazon DynamoDB中添加/删除项目到数组
- Java Swing:为什么在JFrame中拖放会触发“Ctrl C”加速器?
- 如何优雅规避NPE
- JDK 7u79中javax.smartcardio.Card.disconnect(boolean res
- java发送HttpClient请求及接收请求结果过程的简单实例
- Java Unsigned Bytes
- java – Alpha-beta移动排序