С предстоящей RxJava2 release одним из важных изменений является то, что null
больше не принимается как элемент потока, то есть следующий код будет исключение: Observable.just(null)
Честно говоря, у меня смешанные чувства по поводу этого изменения, и часть меня понимает, что он будет применять чистые API-интерфейсы, но я могу видеть ряд вариантов использования, когда это может быть проблемой.
Например, в моем приложении у меня есть кеш в памяти:
@Nullable CacheItem findCacheItem(long id);
CacheItem может отсутствовать в кеше, поэтому метод может возвращать нулевое значение.
Способ, которым он используется с Rx * -, выглядит следующим образом:
Observable<CacheItem> getStream(final long id) {
return Observable.fromCallable(new Callable<CacheItem>() {
@Override public CacheItem call() throws Exception {
return findCacheItem(id);
}
});
}
Таким образом, при таком подходе я могу получить null в моем потоке, который является полностью допустимой ситуацией, поэтому он правильно обрабатывается на стороне получателя - пусть пользовательский интерфейс изменяет свое состояние, если элемент отсутствует в кеше:
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 в какой-то другой класс, либо сделать мой поток, создав эту оболочку, или сделать довольно большие архитектурные изменения.
Обтекание каждого элемента потока в NULL-эквиваленте не выглядит правильным.
Я пропустил что-то фундаментальное здесь?
Похоже, что такая ситуация, как моя, довольно популярна, поэтому мне интересно, какая рекомендуемая стратегия для решения этой проблемы задана новой политикой "нет нуля" в RxJava2?
ИЗМЕНИТЬ См. Последующий разговор в RxJava GitHub repo