如何将Flux<Response>转换为Mono<Map<String, Map<String, Collection<Response>>>>
解决Flux转嵌套Map的Mono实例问题
嘿,这个需求用Reactor的分组和收集API就能轻松实现,我给你写个完整示例,再拆解下每一步的作用:
我们的目标是把Flux<Response>转换成Mono<Map<String, Map<String, Collection<Response>>>>——外层Map以公司名为键,内层以品类为键,对应值是同公司同品类的Response集合。直接看代码:
// 假设你的Response类提供了getCompany()和getCategory()方法获取对应字段 Mono<Map<String, Map<String, Collection<Response>>>> collectMap = Flux.fromIterable(responses) // 可选:过滤掉公司/品类为空的记录,避免后续出现NullPointerException .filter(response -> response.getCompany() != null && response.getCategory() != null) // 第一步:按公司名称分组,得到每个公司对应的Response流 .groupBy(Response::getCompany) // 第二步:处理每个公司的分组流,生成内层的「品类-Response集合」Map .flatMap(groupedCompanyFlux -> groupedCompanyFlux // 把当前公司下的Response按品类收集,用List存储对应集合 .collectMap(Response::getCategory, Collectors.toList()) // 将分组的公司名和内层Map包装成Entry,方便后续统一收集 .map(innerCategoryMap -> new AbstractMap.SimpleEntry<>(groupedCompanyFlux.key(), innerCategoryMap)) ) // 第三步:把所有Entry收集成外层的「公司-内层Map」大Map .collectMap(Map.Entry::getKey, Map.Entry::getValue);
代码拆解说明:
- 过滤环节:如果能保证所有Response的company和category都不为空,这一步可以省略;否则加上能避免后续分组/收集时的空指针异常。
- groupBy分组:
groupBy(Response::getCompany)会把原始流拆分成多个GroupedFlux,每个分组对应一个公司的所有Response。 - 内层Map收集:在
flatMap里,我们对每个公司的Response流调用collectMap,按品类分组并收集成List,得到该公司下的品类-Response集合Map;再把公司名和这个内层Map包装成Map.Entry,方便后续统一收集。 - 外层Map收集:最后用
collectMap把所有Entry收集成最终的嵌套Map,键是公司名,值是对应的内层品类Map。
这个操作全程异步非阻塞,完全符合Reactor的响应式编程模型,就算你的Response集合体量较大也能高效处理~
内容的提问来源于stack exchange,提问作者Chandan Gawri
相关产品推荐
相关产品推荐

