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

Mono替代RxJava中Maybe的doOnComplete的正确方案是什么?

针对Reactor替代RxJava Maybe.doOnComplete的正确方案

原RxJava代码的核心逻辑是:当仓库查询不到目标数据时,Maybe流会触发doOnComplete执行日志记录的副作用,最终返回空流终止流程。

你当前用switchIfEmpty的方案虽然能实现功能,但并非最优解——switchIfEmpty的设计意图是替换空流,而这里我们只需要在空流完成时执行副作用,不需要替换流本身。Reactor提供了更贴合场景的doOnEmpty操作符,专门用于处理Mono为空(无元素即完成)时的副作用逻辑,完全匹配原RxJava代码的语义。

正确实现代码

public Mono<Event> verifyFoo(Event event){
     return Mono.just(event)
            .flatMap(this::foo)
            .doOnEmpty(() -> logNotFound(event));
}

private Mono<Event> foo(Event event){
   // 补充原代码遗漏的return关键字
   return repository.findFooOrEmpty(event)
       .map(unused -> event);
}

private void logNotFound(Event event){
   logger.warn("Foo not found for bar: ", event.getBar());
}

方案说明

  • doOnEmpty仅会在Mono流未发射任何元素就完成时执行传入的副作用逻辑,和RxJava中Maybe的doOnComplete(无元素完成时触发)语义完全对齐。
  • 相比switchIfEmpty,不需要额外通过Mono.defer包装副作用再返回空流,代码更简洁,逻辑表达更清晰,避免了不必要的流替换操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 06:12:36