Обработка нуля в RxJava2
С предстоящимRxJava2 релиз Одним из важных изменений является то, что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 в какой-то другой класс и заставить мой поток создать вместо этого обертку, либо внести довольно большие архитектурные изменения.
Свертывать каждый элемент потока в обнуляемый аналог не выглядит правильным для меня.
Я что-то упустил здесь?
Кажется, что ситуация, подобная моей, довольно популярна, поэтому мне интересно, какова рекомендуемая стратегия для решения этой проблемы, учитывая новую политику "не ноль" в RxJava2?
РЕДАКТИРОВАТЬ Пожалуйста, смотрите последующий разговор вRxJava GitHub репо