Handling null in RxJava2
it dem kommenden RxJava2 release Eine der wichtigsten Änderungen ist, dassnull
wird nicht mehr als Stream-Element akzeptiert, d. h. der folgende Code löst eine Ausnahme aus:Observable.just(null)
Ehrlich gesagt habe ich gemischte Gefühle in Bezug auf diese Änderung und ein Teil von mir weiß, dass sie saubere APIs erzwingen wird, aber ich kann eine Reihe von Anwendungsfällen sehen, wenn dies ein Problem sein könnte.
Zum Beispiel habe ich in meiner App einen In-Memory-Cache:
@Nullable CacheItem findCacheItem(long id);
CacheItem ist möglicherweise nicht im Cache vorhanden, daher gibt die Methode möglicherweise einen Nullwert zurück.
Wie es mit Rx * verwendet wird - ist wie folgt:
Observable<CacheItem> getStream(final long id) {
return Observable.fromCallable(new Callable<CacheItem>() {
@Override public CacheItem call() throws Exception {
return findCacheItem(id);
}
});
}
So kann es bei diesem Ansatz vorkommen, dass mein Stream den Wert null hat, was absolut zutreffend ist, sodass er auf der Empfängerseite ordnungsgemäß verarbeitet wird. Nehmen wir an, die Benutzeroberfläche ändert ihren Status, wenn das Element nicht im Cache vorhanden ist:
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();
}
);
Mit RxJava2 darf ich nicht mehr postennull
den Stream runter, also muss ich entweder mein CacheItem in eine andere Klasse packen und meinen Stream stattdessen diesen Wrapper produzieren lassen oder ziemlich große architektonische Änderungen vornehmen.
Wrapping jedes einzelnen Stream-Elements in nullable Gegenstück sieht für mich nicht richtig aus.
ehlt mir hier etwas Grundsätzliche
Es scheint, dass die Situation wie meine sehr beliebt ist, also bin ich gespannt, welche Strategie empfohlen wird, um dieses Problem angesichts der neuen "no null" -Richtlinie in RxJava2 anzugehen?
BEARBEITE Bitte sehen Sie sich das nachfolgende Gespräch in @ aRxJava GitHub repo