You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:24:25