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
相关产品推荐
相关产品推荐

