Обработка Nullable Type в RxJava с Kotlin

При использовании RxJava2 в Java у меня есть преимущество в том, что фильтрация map() автоматически выбрала нулевые значения. Однако с нулевыми типами в Котлине я делаю что-то вроде этого:

 val loadConferencesSingle = service.getConferences() .map { it.conferences ?: listOf<Conference>() } 

Вызов service.getConferences() в этом случае представляет собой Single-излучение ConferecesResponse которое выглядит как

 data class ConferencesResponse(val conferences: List<Conference?>? = null) 

Поэтому, если полный испущенный список конференций пуст, я в конечном итоге использовал оператор Элвиса, чтобы вместо этого пустить пустой список. Испускать нуль в map невозможно.

Кто-нибудь подскажет, как лучше обращаться с типами NULL в RxJava с Kotlin? Мне уже нравится это решение и его терпкость, но у меня такое ощущение, что есть еще лучшие способы справиться с этим.

Optional для этого вполне допустимый тип в Котлине. Отсутствие значения также является результатом . Вы можете создать простой класс данных и выполнить следующие действия:

 data class Optional<T>(val value: T?) fun <T> T?.carry() = Optional(this) 

При желании вы могли бы создать несколько простых функций расширения, чтобы упростить последующие операторы:

 fun <T, R> Observable<Optional<T>>.mapNullable(mapper: (T?) -> R?) : Observable<Optional<R>> = map { mapper(it.value).carry() } fun <T, R> Observable<Optional<T>>.mapFromNullable(mapper: (T?) -> R) : Observable<R> = map { mapper(it.value).carry() } 

..и так далее.

Это полностью зависит от того, что считается действительным результатом. Есть ли недостаток в conferences что их нет? Тогда пустой список является подходящей заменой. Если это не должно произойти, то выбрасывание исключения может быть подходящим ответом.

Кроме того, бросание исключения также работает с оператором elvis: it.conferences ?: throw IllegalStateException("Why is it null?")

Intereting Posts