【发布时间】:2017-02-08 10:27:30
【问题描述】:
随着即将到来的RxJava2 release 的重要变化之一是null 不再被接受为流元素,即以下代码将引发异常:Observable.just(null)
老实说,我对这一变化有复杂的感受,我的一部分理解它将强制执行干净的 API,但我可以看到许多用例可能会成为问题。
例如,在我的应用中,我有一个内存缓存:
@Nullable CacheItem findCacheItem(long id);
CacheItem 可能不存在于缓存中,因此方法可能返回 null 值。
与 Rx* 一起使用的方式如下:
Observable<CacheItem> getStream(final long id) {
return Observable.fromCallable(new Callable<CacheItem>() {
@Override public CacheItem call() throws Exception {
return findCacheItem(id);
}
});
}
因此,使用这种方法,我的流中可能会得到 null,这是完全有效的情况,因此在接收端可以正确处理 - 假设如果缓存中不存在项目,UI 会更改其状态:
Observable.just(user)
.map(user -> user.getName())
.map(name -> convertNameToId(name))
.flatMap(id -> getStream(id))
.map(cacheItem -> getUserInfoFromCacheItem(cacheItem))
.subscribe(
userInfo -> {
if(userInfo != null) showUserInfo();
else showPrompt();
}
);
使用 RxJava2,我不再被允许在流中发布 null,因此我需要将我的 CacheItem 包装到其他类中并让我的流生成该包装器,或者进行相当大的架构更改。
将每个单独的流元素包装成可以为空的对应元素对我来说并不合适。
我在这里遗漏了一些基本的东西吗?
似乎像我这样的情况很流行,所以我很好奇鉴于 RxJava2 中新的“no null”策略来解决这个问题的推荐策略是什么?
编辑 请看RxJava GitHub repo的后续对话
【问题讨论】:
标签: rx-java