Обработка 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?")

  • Сбор данных с локального и удаленного одновременно с использованием RxJava
  • как получить ответ в модификации при использовании rxAndroid?
  • RxJava Subject: Слушайте другой тип, который тот, который он испускает
  • Как объединить 2 отдельных потока, буферизовать заполненные данные из них и subsrcibe к нему после некоторого времени
  • Поведение с функциями высшего порядка Котлина и интерфейсами с одним методом?
  • RxJava: onBackpressureBlock () странное поведение
  • Создайте общий наблюдаемый, который избегает множественного вызова
  • Асинхронный вызов для каждого элемента внутри коллекции
  • RXJava Игнорировать ошибку и продолжить цепочку
  • Почему я получаю android.os.TransactionTooLargeException в своем приложении для Android, написанном в Kotlin / rxJava, когда я выхожу из приложения? (OnExit / OnPause)?
  • Данные кэша из HTTP-запроса в RxJava
  • Interesting Posts

    Получение учета с использованием Anko SQLite в Котлине

    Возвращаемое значение для переменной, которая, по-видимому, может быть нулевой, но на самом деле не может

    RxJava Live Reactive Queue (с выключенным переключателем)

    Как я могу объявить параметр функции, который может быть строкой или функцией в Kotlin?

    Как собирать подписи от нескольких участников государства в потоке корды?

    Запрещено разрешение на использование Firebase

    Как получить доступ к статическому методу Java в подклассе Kotlin?

    Фрагмент не в котлин, а в java он работает (тот же код)

    Котлинская лямбда с несколькими параметрами

    nullPointerException на вспомогательном классе sharedpreferences При запуске теста

    Нельзя использовать проверку весов с MongoDB

    Синтаксис Котлина для вывода общего супертипа из подтипа

    Как интерпретировать и переводить код kotlin в java?

    Как указать версию RxJava при использовании RxKotlin?

    Dagger 2 ContributesAndroidInjector обеспечивает активность модуля

    Давайте будем гением компьютера.