Manejo de tipo anulable en RxJava con Kotlin

Cuando uso RxJava2 en Java, tengo la ventaja de que map() filtra los valores nulos emitidos automáticamente. Sin embargo, con los types anulables en Kotlin, termino haciendo algo como esto:

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

La llamada service.getConferences() en este caso es Single que emite una ConferecesResponse que se parece a

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

Entonces, en caso de que la list completa de conferencias emitidas sea nula, terminé usando el operador de Elvis para emitir una list vacía. No es posible emitir un nulo en el map .

¿Alguien tiene idea de cómo manejar mejor los types que aceptan nulos en RxJava con Kotlin? Ya me gusta esta solución y su brevedad, pero tengo la sensación de que hay forms aún mejores de manejar esto.

Optional es un tipo completamente válido para esto en Kotlin. La ausencia de un valor es también un resultado . Podrías crear una class de datos simple y funcionar así:

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

Opcionalmente, podría crear algunas funciones de extensión simples para facilitar los siguientes operadores:

 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() } 

..y así.

Depende completamente de lo que se considera un resultado válido. ¿La falta de conferences significa que no hay ninguna? Entonces la list vacía es un sustituto apropiado. Si no está destinado a suceder, lanzar una exception podría ser la respuesta adecuada.

Además, lanzar una exception también funciona con el operador elvis: it.conferences ?: throw IllegalStateException("Why is it null?")

  • ¿Cómo se coordina una list de ejecuciones Completables con RxJava?
  • RxJava: cómo devolver el tipo correcto de nulo
  • Rx Java Retrofit con flatMap se ejecuta solo una vez
  • MVP + RxJava - ¿Poner los progtwigdores en el presentador o en el interaccionador?
  • OnComplete nunca se llamó con toSortedList () y groupBy ()
  • Escuchar posts y escribir commands en un flujo observable
  • ¿Cómo get respuesta en la retroadaptación al usar rxAndroid?
  • RxJava zipCon error IDE en Kotlin con Android Studio 3.0
  • JavaRX: cómo devolver el valor en caching inmediatamente y en paralelo hacer una request de networking
  • Combinando los resultados de múltiples observables
  • IncompatibleClassChangeError: Class 'java.lang.VirtualMachineError' no implementa la interfaz 'java.lang.CharSequence'