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

如何在Spring WebFlux中合并两个Flux生成聚合HashMap?

问题分析与解决方案

问题原因

你的代码中,collectMap的第二个参数返回的是Mono<Integer>(reduce操作的结果),但collectMap会直接将这个Mono对象作为Map的value存入,而非等待Mono完成后取出实际的整数值,因此最终得到的是MonoReduceSeed对象而非求和结果。

解决方案

需要先将answersFlux缓存为可复用的Mono(避免重复订阅触发多次数据源查询,比如数据库请求),然后针对每个组合计算符合条件的Answer的count总和,最后将组合与对应的总和映射为Entry,再收集成目标Map。

代码实现

// 先将answersFlux缓存为Mono<List<Answer>>,仅订阅一次数据源
Mono<List<Answer>> answersMono = answersFlux.cache();

Mono<Map<Set<Integer>, Integer>> resultMap = combinationsFlux
    .flatMap(combination -> 
        // 计算当前组合对应的count总和
        answersMono.map(answers -> 
            answers.stream()
                .filter(answer -> 
                    // 判断Answer的values与当前组合是否有交集
                    answer.getValues().stream().anyMatch(combination::contains)
                )
                .mapToInt(Answer::getCount)
                .sum()
        )
        // 将组合与总和封装为Map.Entry
        .map(sum -> Map.entry(combination, sum))
    )
    // 收集所有Entry为目标Map
    .collectMap(Map.Entry::getKey, Map.Entry::getValue);

关键说明

  1. 缓存answersFlux:使用cache()将answersFlux转换为Mono<List<Answer>>,确保仅订阅一次数据源,避免重复查询(如果answersFlux来自ReactiveRepository,重复订阅会触发多次数据库请求)。
  2. flatMap展开异步结果:通过flatMap将每个组合对应的求和Mono展开,获取实际的整数值,而非将Mono直接作为Map的value。
  3. 过滤与求和:使用Java Stream对缓存的Answer列表进行过滤(匹配组合的任意值)和求和操作,逻辑清晰且高效。

结果验证

运行上述代码后,将得到符合预期的Map:

KeyValue
{1, 2}7
{1, 3}8
{2, 3}4

内容的提问来源于stack exchange,提问作者c89ec

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:00:46