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

如何使用Mono链式处理依赖前序结果的输入值?

实现Mono链式依赖处理需求

你当前的代码没有实现链式依赖——每个Mono都直接用初始的originStr生成,没有让后续操作依赖前一步的结果。要得到+1+2+3hello的结果,可以用以下两种方式实现:

方式一:严格顺序链式处理(符合依赖前一步结果的要求)

这种方式完全遵循“后续处理输入依赖前一步结果”的要求,每一步都等待前一步Mono完成后再执行:

import reactor.core.publisher.Mono;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MonoMapReplaceTest {
    public static void main(String[] args) {
        String originStr = "hello";
        List<String> rules = List.of("+1", "+2", "+3");

        // 以原始字符串为起点创建初始Mono
        Mono<String> resultMono = Mono.just(originStr);
        
        // 反转规则列表,因为需要从最后一个规则开始往前拼接,才能得到目标顺序
        List<String> reversedRules = new ArrayList<>(rules);
        Collections.reverse(reversedRules);
        
        // 链式串联每个处理步骤:每一步的输入都是前一步的输出
        for (String rule : reversedRules) {
            resultMono = resultMono.flatMap(currentResult -> getValueFromRemote(rule, currentResult));
        }

        // 订阅并打印最终结果
        resultMono.subscribe(System.out::println); // 输出:+1+2+3hello
    }

    private static Mono<String> getValueFromRemote(String input, String currentStr) {
        // 保持你原有的拼接逻辑:将规则拼接到当前结果的前面
        return Mono.just(input + currentStr);
    }
}

逻辑说明

  1. 初始Mono持有原始字符串hello。
  2. 反转规则列表是为了从最后一个规则+3开始处理:
    • 第一步:+3 + hello → +3hello
    • 第二步:+2 + +3hello → +2+3hello
    • 第三步:+1 + +2+3hello → +1+2+3hello
  3. 使用flatMap确保每一步都等待前一步Mono完成,严格遵循依赖顺序。

方式二:先累积规则再拼接(简洁高效,适合简单拼接场景)

如果你的规则处理只是简单字符串拼接,不需要复杂的异步逻辑,可以先用Flux.reduce累积所有规则,再和原始字符串组合:

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.List;

public class MonoMapReplaceTest {
    public static void main(String[] args) {
        String originStr = "hello";
        List<String> rules = List.of("+1", "+2", "+3");

        // 先通过reduce操作累积拼接所有规则
        Mono<String> ruleConcatMono = Flux.fromIterable(rules)
                .reduce("", (accumulated, rule) -> accumulated + rule);
        
        // 将累积后的规则字符串与原始字符串拼接,得到最终结果
        Mono<String> resultMono = ruleConcatMono.map(ruleStr -> ruleStr + originStr);

        resultMono.subscribe(System.out::println); // 输出:+1+2+3hello
    }

    private static Mono<String> getValueFromRemote(String input, String currentStr) {
        return Mono.just(input + currentStr);
    }
}

逻辑说明

  1. Flux.fromIterable(rules)将规则列表转为流式数据源,逐个发射规则。
  2. reduce操作依次将每个规则拼接到累积字符串中,最终得到+1+2+3。
  3. 最后用map把累积的规则字符串和原始字符串拼接,得到目标结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:30:53