Cómo pasar nulo a un Observable con tipo anulable en RxJava 2 y Kotlin

Inicializo mi variable así:

val user: BehaviorSubject<User?> user = BehaviorSubject.create() 

Pero no puedo hacer esto. IDE arroja un error: –

 user.onNext(null) 

Y haciendo esto, IDE dice que nunca serás nulo: –

 user.filter( u -> u!=null) 

Como Guenhter explicó, esto no es posible. Sin embargo, en lugar de proponer el patrón de object nulo, recomendaría una implementación del tipo Optional :

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

Esto hace que tu intención sea mucho más clara, y puedes usar una statement de desestructuración en tus funciones:

 Observable.just(Optional("Test")) .map { (text: String?) -> text?.substring(1)?.asOptional() } .subscribe() 

Usar el patrón de object nulo aquí puede causar más errores de los que resuelve.

Si usa rxkotlin / rxjava 2.0 (supongo), entonces la respuesta es: no puede. La razón se explica aquí.

Esto es un quiebre de la interfaz. Echa un vistazo a la interfaz Observable

 public interface Observer<T> { /** ... */ void onSubscribe(@NonNull Disposable d); /** ... */ void onNext(@NonNull T t); /** ... */ void onError(@NonNull Throwable e); /** ... */ void onSubscribe(@NonNull Disposable d); /** ... */ void onNext(@NonNull T t); /** ... */ void onError(@NonNull Throwable e); ... 

El comstackdor de Kotlin considerará @NonNull y, por lo tanto, NO PUEDE pasar nulo.

Incluso si pudiera, el onNext arrojaría inmediatamente un error:

 @Override public void onNext(T t) { if (t == null) { onError(new NullPointerException("onNext called with null. Null values are generally not allowed in 2.x operators and sources.")); return; } ... } 

Si realmente necesitas algo como null , tienes que fingirlo. por ejemplo, al crear un object estático de User que representa su elemento null .

p.ej

 data class User(val username, val password) { companion object { val NULL_USER = User("", "") } } ... val user = BehaviorSubject.create<User>() ... user.onNext(User.NULL_USER) ... user.filter { it !== User.NULL_USER } 

Pero de alguna manera es posible, trate de evitar el concepto null y quizás piense en otra solución donde esto no sea necesario.

Muchas gracias por todas sus respuestas, pero finalmente fui con esta solución:

class UserEnvelope (private val: User?) {}

Y usa BehaviorSubject

Esto se adapta mejor a mis requisitos.

Ahora, sobre los Opcionales, no estoy seguro, pero no creo que pueda get el tipo para ser Usuario y tendría que escribir el reparto cada vez que necesito acceder a él. ¿Me equivoco? Soy nuevo en Kotlin.

Muchas gracias por todas sus respuestas, pero finalmente fui con esta solución:

class UserEnvelope (val user: User?) {}

Y usando esto en los observables.

Esto se adapta mejor a mis requisitos.

Soy nuevo en Kotlin, así que no sé cómo usar Opcionales. Pero por lo que entiendo, tendría que encasillarlo en Tipo de usuario cada vez que necesito observar los valores, ¿verdad?

  • Obligatorio <Objeto> y encontrado <Objeto>?
  • Usando RxJava para unir datos locales con datos remotos (o en caching)
  • ¿Cómo hacer un grupo? ¿Por qué coleccionar usando RxJava y Kotlin?
  • ¿Puedo crear un método de extensión Kotlin para agregar una suscripción rxJava a una suscripción compuesta?
  • ¿Cómo puedo agregar de manera condicional una operación asincrónica en medio de una transmisión de RxJava?
  • RxKotlin collectInto () MutableList usando references de método
  • RxJava - ¿Entradas de keyboard de contrapresión?
  • RxJava- Gire Observable en Iterator, Stream o Sequence
  • Confusión de la syntax de Kotlin lambda
  • Rx-Kotlin awaitTerminalEvent nunca se sube a Completo
  • OnComplete nunca se llamó con toSortedList () y groupBy ()