Reactor中filter与defaultIfEmpty组合使用过滤逻辑不生效问题求助
问题根本原因
你代码里filter逻辑失效的核心问题是每次过滤操作后立刻调用了defaultIfEmpty(responseData),执行流程如下:
- 调用第一个
filter,isValidLastFour返回false,当前Mono变为空序列 - 紧跟的
defaultIfEmpty(responseData)会立刻把空序列重新填充为原始的responseData对象,相当于前一步的过滤完全没有生效 - 后续的过滤、
flatMap操作都会拿到正常的对象继续执行,自然不会出现你预期的终止链路的效果
正确实现方案
如果你的业务逻辑是只有两个过滤条件同时满足时,才执行updateCardNumber更新操作,否则直接返回原始的responseData,调整代码如下即可:
private Mono<GetCardNumberServiceResponseData> updateCardNumberIfLastFourValidAndShaIsNull(Card card, GetCardNumberServiceResponseData responseData) { return Mono.just(responseData) // 串联两个过滤条件,任意一个不满足都会让Mono变为空 .filter(response -> isValidLastFour(card, response)) .filter(response -> shaIsNull(card)) // 只有两个过滤都通过才会执行更新操作 .flatMap(response -> updateCardNumber(card, response)) // 任意环节出现空序列,统一返回原始responseData .defaultIfEmpty(responseData); }
补充说明
如果你需要针对不同过滤条件的失败场景做不同的处理,可以把defaultIfEmpty替换为switchIfEmpty分别处理对应分支即可,当前场景下统一在末尾兜底即可满足需求。
内容的提问来源于stack exchange,提问作者lukederienzo
相关产品推荐
相关产品推荐

