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

如何控制Reactor中Mono.zip(list)按顺序执行?

解决Mono列表串行执行并收集结果的方案

你当前使用Mono.zip会并行启动所有Mono实例,导致内存消耗较高。要实现依次执行并收集结果,可以采用Reactor提供的以下两种常用方案:

方案一:Flux.concat + collectList(推荐)

通过Flux.concat按顺序订阅每个Mono(前一个执行完成后才启动下一个),再用collectList将所有结果收集为List,最终得到包含完整结果的Mono<List<T>>:

var monos = List.of(m1, m2, m3);
Flux.concat(monos)
    .collectList()
    .subscribe(results -> {
        // 处理结果列表,顺序与原monos列表完全一致
    });

方案二:Stream.reduce链式串联

如果需要更底层的链式控制,可以通过Stream的reduce方法,将每个Mono依次串联,逐步收集结果:

var monos = List.of(m1, m2, m3);
monos.stream()
    .reduce(Mono.just(new ArrayList<>()),
            (accumulatorMono, nextMono) -> accumulatorMono.flatMap(resultList -> 
                nextMono.map(nextResult -> {
                    resultList.add(nextResult);
                    return resultList;
                })
            ),
            (list1, list2) -> {
                list1.addAll(list2);
                return list1;
            })
    .subscribe(finalResultList -> {
        // 处理最终收集的结果列表
    });

两种方案都能保证Mono按顺序执行,避免并行带来的内存占用问题,其中方案一代码更简洁,是Reactor中处理这类场景的常规做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:10:30