如何使用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); } }
逻辑说明
- 初始Mono持有原始字符串
hello。 - 反转规则列表是为了从最后一个规则
+3开始处理:- 第一步:
+3+hello→+3hello - 第二步:
+2++3hello→+2+3hello - 第三步:
+1++2+3hello→+1+2+3hello
- 第一步:
- 使用
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); } }
逻辑说明
Flux.fromIterable(rules)将规则列表转为流式数据源,逐个发射规则。reduce操作依次将每个规则拼接到累积字符串中,最终得到+1+2+3。- 最后用
map把累积的规则字符串和原始字符串拼接,得到目标结果。
内容的提问来源于stack exchange,提问作者tangyaya
相关产品推荐
相关产品推荐

