rx-java2 flatMap 中的空处理

Null handling in rx-java2 flatMap

docs 中所述,RxJava 2.x 不再接受空值。因此,以下两行都以 onError called:

结尾也就不足为奇了
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) 如果有意,是否有原因?

这是 Observable.fromCallable 的错误,将在 PR 5517 中修复。

如果由于某种原因您无法在此设置中避免空值 return,您可以应用 hide() 来解决此错误:

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

或者帮助RxJava抛出:

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