2015-09-29 7 views
8

他の言語のストリーム/機能土地には、orElse()という共通の操作が1つあります。 ifは、ifのように機能し、現在のチェーンに結果が得られなかった場合は、代わりのものに変更されます。 Maybe型の言語では、基本的にはSome型のチェーンを続けるか、None型のorElseに変更します。RxJavaに相当するorElseとは

理想的な場合:

Observable.just(false) 
      .filter(value -> { return value; }) 
      .map(value -> { return 1; }) 
      .orElse(Observable.just(0)); 

Observable.<Boolean>error(new IllegalStateException("Just playing")) 
      .filter(value -> { return value; }) 
      .map(value -> { return 1; }) 
      .orElse(Observable.just(0)); 

それは現在、連結とtakeFirstを使用して再現することができますが、それは意味的に全く同じではありませんし、適切なエラー処理をカバーしていません。

Observable.concat(Observable.just(false) 
          .filter(value -> { return value; }) 
          .map(value -> { return 1; }), 
        Observable.just(0)) 
      .takeFirst(); 

答えて

9

、彼らがいることが、異なる命名しているように見えます:defaultIfEmptyまたはswitchIfEmpty。

Observable.just(false) 
     .filter(value -> value) 
     .map(value -> 1) 
     .defaultIfEmpty(0) 
     .subscribe(val -> { 
      // val == 0 
     }); 

Observable.just(false) 
     .filter(value -> value) 
     .map(value -> 1) 
     .switchIfEmpty(Observable.just(0)) 
     .subscribe(val -> { 
      // val == 0 
     }); 

// Error thrown from the first observable 
Observable.<Boolean>error(new IllegalStateException("Crash!")) 
     .filter(value -> value) 
     .map(value -> 1) 
     .switchIfEmpty(Observable.<Integer>error(new IllegalStateException("Boom!"))) 
     .subscribe(val -> { 
      // never reached 
     }, error -> { 
      // error.getMessage() == "Crash!" 
     }); 

// Error thrown from the second observable 
Observable.just(false) 
     .filter(value -> value) 
     .map(value -> 1) 
     .switchIfEmpty(Observable.<Integer>error(new IllegalStateException("Boom!"))) 
     .subscribe(val -> { 
      // never reached 
     }, error -> { 
      // error.getMessage() == "Boom!" 
     }); 
+0

エラーケースは処理されませんが、onErrorResumeNextまたはonErrorReturnが必要です。 –

+1

こんにちは@ MLProgrammer-CiM。私はそれがエラーケースを処理する必要があります大丈夫だと思う私は、第1または第2観測からどのように捕捉するかの例を追加しました。 (btw、コーディングは私が思うと魔法ですか?) –

+0

これは私のケースをカバーしていません。最初の観測可能なものが正しかったのではなく失敗したとしますが、switchIfEmptyルートを変更したいと思っています。なぜなら、orElseがやることだからです。 –

関連する問題