如何用Reactor操作简化含if-else的代码结构及进阶用法咨询
Reactor相关问题解答
1. 如何用Reactor操作简化if-else逻辑
你的代码核心逻辑是:查询账户→验证存在性→验证账户有效性→返回结果。嵌套的if-else可以通过Reactor的链式操作符拆解,让逻辑更清晰、符合响应式风格:
优化后的代码(假设repository未找到账户时返回Mono.empty())
accountRepository.findByAccount(accountVo.accountId()) // 账户不存在时抛错 .switchIfEmpty(Mono.error(new IllegalAccessException("account not exists"))) // 过滤验证不通过的账户,不满足则流变为empty .filter(acc -> verifyAccount().apply(acc)) // 验证不通过时抛错 .switchIfEmpty(Mono.error(new AccountException("password is invalid"))) // 同步转换为目标结果 .map(AccountHelper.INSTANCE::buildAccountInfo);
如果repository确实会返回Mono.just(null)(不推荐),可补充非空过滤:
accountRepository.findByAccount(accountVo.accountId()) .filter(Objects::nonNull) .switchIfEmpty(Mono.error(new IllegalAccessException("account not exists"))) .filter(acc -> verifyAccount().apply(acc)) .switchIfEmpty(Mono.error(new AccountException("password is invalid"))) .map(AccountHelper.INSTANCE::buildAccountInfo);
关键操作符说明:
switchIfEmpty:上游流为空时触发,替代原代码中的null判断逻辑filter:过滤不满足条件的元素,验证失败时流进入empty分支map:同步转换对象,比flatMap更轻量(此处无需异步操作)
2. Reactor的高级特性与实用用法
- 精细化错误处理:
onErrorResume:捕获异常后返回新流,适合降级场景(如查询失败后读取缓存);onErrorReturn直接返回默认值retryWhen:自定义重试逻辑,支持按异常类型、次数、延迟时间重试,比基础的retry()更灵活
- 背压控制:
- 针对上下游速率不匹配的场景,用
onBackpressureBuffer缓存溢出元素、onBackpressureDrop丢弃溢出元素、onBackpressureLatest保留最新元素,避免内存溢出
- 针对上下游速率不匹配的场景,用
- 复杂流组合:
zip:等待所有流都发射元素后合并,适合依赖多个异步结果的场景;combineLatest:任意流发射元素时,合并所有流的最新元素mergeSequential:按顺序合并多个流,保证元素发射顺序,区别于merge的并发合并
- 上下文传递:
- 通过
contextWrite写入上下文,deferContextual读取上下文,在链式调用中传递全局信息(如用户ID、请求ID),避免参数透传
- 通过
- 冷热序列转换:
publish().refCount(n):将冷序列(每次订阅重新执行)转为热序列(多订阅共享上游);cache()缓存上游元素,重复订阅时直接返回缓存结果
- 自定义操作符:
- 用
transform封装重复逻辑实现复用;用lift操作订阅过程,扩展底层行为(如统一日志、埋点)
- 用
内容的提问来源于stack exchange,提问作者Peng
相关产品推荐
相关产品推荐

