Saltar al contenido

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

Si te encuentras con alguna parte que no comprendes puedes dejarlo en los comentarios y te ayudaremos lo mas rápido que podamos.

Solución:

Como explicó Guenhter, esto no es posible. Sin embargo, en lugar de proponer la null-patrón de objeto, recomendaría una implementación del Optional escribe:

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

Esto hace que su intención sea mucho más clara y puede usar una declaración de desestructuración en sus funciones:

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

Utilizando el null-El patrón de objeto aquí puede causar más errores de los que resuelve.

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

Esta es una ruptura de la interfaz. Echa un vistazo a la Observable Interfaz

public interface Observer {

    /** ... */
    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 @NonNull será considerado por el compilador de Kotlin y, por lo tanto, NO PUEDE pasar null.

Incluso si pudieras, 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 fingir. por ejemplo, creando un static objeto de User que representa tu null-elemento.

p.ej

data class User(val username, val password) 

    companion object 
        val NULL_USER = User("", "")
    

...
val user = BehaviorSubject.create()
...
user.onNext(User.NULL_USER)
...
user.filter  it !== User.NULL_USER 

Pero de alguna manera es posible, trate de evitar el null concepto y tal vez pensar en otra solución donde esto no sea necesario.

Muchas gracias por todas sus respuestas, pero finalmente opté por esta solución: –

class UserEnvelope(val user:User?) 

Y usando esto en los observables.

Esto se adaptó 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 al tipo de usuario cada vez que necesito observar los valores, ¿verdad?

Aquí tienes las comentarios y valoraciones

Si estás contento con lo expuesto, tienes la libertad de dejar un ensayo acerca de qué le añadirías a esta sección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *