关于将Vertx Future<T>转换为Rx Observable<Optional<T>>的工具函数可行性问询
原代码的问题
- 类型不匹配:原代码生成的是
Observable<T>,而非你需要的Observable<Optional<T>>,直接无法满足类型要求 - 错误处理不符合预期:当Vertx Future执行失败时,
Observable.fromCompletionStage()会直接触发onError事件,而不是发射一个Optional.empty()或者包装后的可选值
可行的实现方案
要实现将Vertx Future<T>转换为Rx Observable<Optional<T>>,需要同时处理成功值包装和错误场景转换,示例代码如下:
import io.vertx.core.Future; import java.util.Optional; import io.reactivex.rxjava3.core.Observable; public class VertxRxUtils { public static <T> Observable<Optional<T>> convertVertxFutureToObservable(Future<T> future) { return Observable.fromCompletionStage(future.toCompletionStage()) // 成功时将结果包装为Optional,兼容返回null的场景 .map(Optional::ofNullable) // 失败时发射空Optional,可根据业务需求调整逻辑 .onErrorReturn(throwable -> Optional.empty()); } }
关键细节说明
map(Optional::ofNullable):既处理成功有值的情况,也兼容Vertx Future成功但返回null的场景onErrorReturn:将Future的失败异常转换为Optional.empty()发射,避免Observable触发onError中断流;如果需要保留异常信息,可以自定义包含异常的包装类替代Optional<T>
内容的提问来源于stack exchange,提问作者RanAbitbul
相关产品推荐
相关产品推荐

