RxJava2:首先替代rx.Observable方法(谓词)

时间:2017-03-08 20:28:23

标签: java rx-java reactivex rx-java2

我想使用RxJava但不能提出方法的替代方法

public final Observable<T> first(Func1<? super T,java.lang.Boolean> predicate)

在RxJava2中。

我想要做的是:

return io.reactivex.Observable
    .concat(source1, source2, source3, source4)
    .first(obj -> obj != null);

参数source1到source4是我连接的io.reactivex.Observable个实例,我希望结果Observable只发出第一个不是null的项,但这当然会失败,因为io.reactivex.Observable没有&#39} ; t方法first(Func1 predicate)rx.Observable类似。

如果我在RxJava2中有任何选项,或者最好坚持使用RxJava1,我有什么选择?

3 个答案:

答案 0 :(得分:4)

考虑使用Maybe代替Observable可空类型(它不能使用 RxJava2 )。然后使用Maybe.concat仅将发出的项目设为Flowable。只需使用first的第一个元素返回Single(您必须指定默认项)或firstElement返回Maybe

Maybe.concat(source1, source2, source3, source4)
    .firstElement()

答案 1 :(得分:1)

首先将其重命名为firstElement。此外,Rx 2.0不支持流上的空值。

Rx.Java 2.0 Doc - 1.0 x 2.0

答案 2 :(得分:1)

RxJava2不允许按其他人的建议发出 null 值。

但是,如果用于确定要返回的第一个值的谓词不是检查null,则可以考虑在.filter之前使用.first(需要指定一些默认值)或{{ 1}}(如果没有匹配则发出OnError)

.firstOrError