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()))
)
如 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()))
)