2017-03-08 7 views
2

私はRxJavaを使用したいが、方法RxJava2でRxJava2:最初rx.Observable方法の代替(述語)

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

ための代替を考え出すことはできません。

私は何をしたい以下の通りです:

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

パラメータsource4にSOURCE1私は連結して、私がnullではないだけに非常に最初の項目を発するように観察可能な結果たいio.reactivex.Observableインスタンスであるが、このコースのをio.reactivex.Observableにはのような方法first(Func1 predicate)がないので失敗します。

私はRxJava2を使用している場合、またはRxJava1を使用する方が良いですか?

答えて

1

最初に名前がfirstElementに変更されました。また、Rx 2.0はストリーム上でNULL値をサポートしていません。

Rx.Java 2.0 Doc - 1.0 x 2.0

3

Maybe代わりのNULL可能タイプのObservableを(それがRxJava2では動作しません)使用することを検討してください。その後、Maybe.concatを使用して、放出されたアイテムのみをFlowableとして取得します。そして、ちょうどSingleを返すためにfirstで最初の要素を取得Maybeを返すために、またはfirstElement(デフォルトの項目を指定する必要があります):

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

RxJava2が他の人によって提案されヌル値を発することはできません。 (代わりにEMIT ONERROR何もマッチしていない場合)

場合は、しかし、その最初の値が返されるものを決定するための述語はnullをチェックし、あなたがして.first.filterを使用することを検討していません(いくつかのデフォルト値を指定する必要があります)または.firstOrError

return io.reactivex.Observable 
    .concat(source1, source2, source3, source4) 
    .filter(obj -> obj == someAnotherObj) 
    .firstOrError();