RxJava 2中RxJava 1 Observable.from+firstOrDefault的等效Single实现方法
从RxJava 1的Observable转RxJava 2的Single实现方案
没问题,我来帮你梳理下RxJava 1到RxJava 2的转换逻辑,同时验证你的实现思路是否正确。
首先拆解你原RxJava 1代码的核心逻辑:
- 从
List<SomeObject>创建数据流 - 找到第一个满足
aObject.isSomething()条件的元素;如果列表中没有符合条件的元素,就返回预设的aDefaultObject - 原代码返回
Observable<SomeObject>,但这个流一定会且仅会发射一个元素,所以转成RxJava 2的Single<SomeObject>是完全贴合场景的选择。
正确的转换实现方式
在RxJava 2中,我们有几种等价且简洁的写法,这里分两种常用场景说明:
场景1:不需要处理背压(用Observable)
这种写法最直接,和原逻辑完全匹配:
// objects 是 List<SomeObject> 类型 return Observable.fromIterable(objects) .filter(SomeObject::isSomething) .first(aDefaultObject);
这里Observable.first(aDefaultObject)会直接返回Single<SomeObject>——因为它保证会发射一个元素(要么是第一个符合过滤条件的元素,要么是默认值),完美满足你的返回类型要求。
场景2:需要处理背压(用Flowable)
如果你的场景需要处理背压,用Flowable的思路是完全正确的,只需要补全后续操作即可:
return Flowable.fromIterable(objects) .filter(SomeObject::isSomething) .first(aDefaultObject) .toSingle();
解释一下:Flowable.first(aDefaultObject)返回的是Maybe<SomeObject>,所以通过toSingle()就能转成你需要的Single<SomeObject>,整个逻辑和原RxJava 1代码完全一致,你的这个实现思路是正确的。
额外补充
RxJava 2把RxJava 1中firstOrDefault(predicate, defaultValue)的逻辑拆成了filter(predicate) + first(defaultValue)的组合,功能完全等价,写法上更符合RxJava 2的操作符设计规范。
内容的提问来源于stack exchange,提问作者ericn
相关产品推荐
相关产品推荐

