2017-07-25 33 views
0

docs中所述,RxJava 2.x不再接受空值。因此,這並不奇怪,無論是以下兩行與onError叫做終止:rx-java2中的空處理flatMap

Observable.fromCallable(() -> null); 
Observable.just(1).flatMap(i -> Observable.error(new RuntimeException())); 

什麼不清楚就是爲什麼

Observable.just(1).flatMap(i -> Observable.fromCallable(() -> null)) 

終止與成功,並沒有任何項目發出的。它接縫有理由期待它以同樣的方式表現爲Observable.error

我可以在RX-Java的源代碼見2.1.2

public final <R> Observable<R> flatMap(...) { 
    if (this instanceof ScalarCallable) { 
     @SuppressWarnings("unchecked") 
     T v = ((ScalarCallable<T>)this).call(); 
     if (v == null) { 
      return empty(); 
     } 
     ... 
} 

這可以解釋爲什麼它在代碼方面發生,但我仍然有兩個問題:

1)這是預期的行爲還是錯誤?

2)如果有意,是否有原因?

回答

1

這是一個與Observable.fromCallable相關的錯誤,將使用PR 5517進行修復。

如果由於某種原因,你不能避免在此設置一個空的回報,你可以申請hide()來解決此錯誤:

Observable.just(1).flatMap(i -> Observable.fromCallable(() -> null).hide()) 

或幫助RxJava拋出:

Observable.just(1) 
    .flatMap(i -> Observable.fromCallable(() -> 
     java.util.Objects.requireNonNull(apiReturningNull())) 
    )