Reactor场景下匹配到适用IStrategy时立即调用add方法的实现咨询
解决方案
要实现按顺序校验、匹配到第一个适配策略就终止后续校验的效果,可通过concatMap结合filter+next()的组合实现,核心利用concatMap按顺序处理上游元素、前一个元素处理完成才会处理下一个的特性,避免提前触发所有策略的isApplicable方法。
实现代码
List<IStrategy> strategiesList = Arrays.asList(strategy1, strategy2, strategy3); return Flux.fromIterable(strategiesList) // 按顺序逐个处理策略,转换为「策略+适配结果」的元组,仅前一个策略处理完成才会处理下一个 .concatMap(strategy -> strategy.isApplicable(aString) .map(isMatch -> Tuples.of(strategy, isMatch)) ) // 过滤出适配的策略 .filter(Tuple2::getT2) // 取第一个适配的元素,拿到结果后立即取消上游订阅,不再执行后续策略的校验 .next() // 调用匹配策略的add方法 .flatMap(tuple -> tuple.getT1().add(aString));
异常兼容(可选)
如果需要处理无任何适配策略的场景,可在next()后补充switchIfEmpty逻辑自定义兜底行为:
.next() // 示例:无适配策略时返回自定义异常 .switchIfEmpty(Mono.error(new RuntimeException("未找到匹配的处理策略"))) .flatMap(tuple -> tuple.getT1().add(aString))
内容的提问来源于stack exchange,提问作者harry-potter
相关产品推荐
相关产品推荐

