orElse

2015-09-29 9 views
8

'un RxJava eşdeğeri nedir? Diğer dillerde stream/functional land alanında ortak bir işlem var, orElse(). Mevcut zincirin herhangi bir sonuç elde etmediği durumlarda, alternatif olana dönüşür. Belki türlerine sahip bir dilde temelde bir tür için zincire devam eder veya bir None türündeki orElse değerine geçer.orElse

İdeal durum: Bu olabilir

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)); 

anda concat ve takeFirst kullanılarak yeniden, ama sadece değil semantik aynı olduğunu ve düzgün hata işleme kapsamaz. defaultIfEmpty veya switchIfEmpty: onlar, ancak farklı adlandırma ile var gibi

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

cevap

9

görünüyor.

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

olsa hata davalarını değil, siz onErrorResumeNext veya onErrorReturn gerekiyordu. –

+1

Merhaba @ MLProgrammer-CiM. Bence hata durumlarını halletmeli. İlk veya ikinci gözlemlenebilirlikten nasıl yakalayacağımı gösteren ek örnekler ekledim. (btw, kodlama sihir var mıyım? cool;) –

+0

Bunlar benim davamı kapsamıyor. Gözlemenin başlamasının, sadece bir şey olmak yerine başarısız olduğunu, ancak yine de, switchEfEmpty yolunu değiştirmek istediğimi düşünün. –

İlgili konular