web-dev-qa-db-fra.com

RxJava: Comment extraire un objet d'observable?

J'ai l'impression que c'est une question idiote, mais je n'ai pas trouvé de réponse pendant un moment, alors je vais la poser, désolée :)

J'ai donc besoin d'une fonction qui effectue les tâches suivantes:

1) Appelle une autre fonction pour créer un utilisateur observable

2) Obtient l'objet User de l'utilisateur observable

3) Obtient des informations sur l'utilisateur et traverse une logique

4) renvoie l'utilisateur observable

J'ai des problèmes avec l'étape n ° 2. Comment je fais ça? Ou bien cette approche est-elle fondamentalement fausse?

Voici le "modèle" de la fonction:

@Override protected Observable buildUseCaseObservable(){

    Observable<User> userObservable = userRepository.findUserByUsername(username);

    //User user = ??????

    //if (...) {...}

    return userObservable;
}

Je vous remercie :)

8
Daniil Orekhov

Vous ne pouvez pas «extraire» quelque chose d'un observable. Vous obtenez des éléments observables lorsque vous vous y abonnez (s’ils en émettent). Puisque l'objet que vous renvoyez est de type Observable, vous pouvez appliquer des opérateurs pour transformer vos données en liens. L'opérateur le plus commun et facile à utiliser dans RxJava est «map», qui modifie une forme de données en une autre en appliquant une fonction. 

Dans votre cas, vous pouvez utiliser l'opérateur 'map' directement sur Observable<user>:

return userRepository.findUserByUsername(username)    
       .map(new Func1<User, Object>() {
                @Override
                public Object call(User u) {
                    // ..
                    // apply your logic here
                    // ..
                    return myDataObject; // return you data here to subcribers
                }
            });

J'espère que vous connaissez les bases de RxJava et que vous n'avez besoin d'aucune introduction sur l'utilisation des opérateurs. Pour la documentation de la carte, suivez ce link

2
Rafay Ali

Vous pouvez utiliser des opérateurs (map, flatMap, doOnNext, etc.) pour que l'objet observable soit enveloppé par votre observable dans le pipeline.

     Observable.just("hello world")
               .map(sentence-> sentence.toUpperCase) --> do whatever you need.
               .subscribe(sentence -> println(sentence)

De par leur conception, Observable suit le modèle Observer, qui s’abonne à l’observable et reçoit l’article une fois qu’il a été émis par le biais du pipeline.

De plus, vous pouvez également utiliser l'observateur patter, il suffit d'extraire l'objet du pipeline à l'aide de toBlocking. Mais c’est considérer comme un motif anti et cela signifie que vous n’appliquez pas un bon dessin.

          @Test
public void observableEvolveAndReturnToStringValue() {
    assertTrue(Observable.just(10)
                         .map(String::valueOf)
                         .toBlocking()
                         .single()
                         .equals("10"));
}

Vous pouvez voir plus d'exemples sur le blocage ici https://github.com/politrons/reactive/blob/master/src/test/Java/rx/observables/utils/ObservableToBlocking.Java

5
paul