web-dev-qa-db-fra.com

Convertir observable en liste

J'utilise RxJava.

J'ai un Observable<T>. Comment puis-je le convertir en List<T>

Cela semble être une opération simple, mais je n'ai pu le trouver nulle part sur le net.

36
Khanh Nguyen

Vous pouvez utiliser toList () ou toSortedList () . Par exemple.

observable.toList(myObservable)
          .subscribe({ myListOfSomething -> do something useful with the list });
23
sol4me

RxJava 2+:

List<T> = theObservarale
             .toList()
             .blockingGet();
9
Andrey

Vous pouvez également utiliser l'opérateur collect:

    ArrayList list = observable.collect(ArrayList::new, ArrayList::add)
                               .toBlocking()
                               .single();

Avec collect, vous pouvez choisir le type de Collection que vous préférez et effectuer une opération supplémentaire sur l'élément avant de l'ajouter à la liste.

3
araknoid

Vous ne pouvez pas convertir observable en liste de manière idiomatique, car une liste n'est pas vraiment un type qui convient à Rx.

Si vous souhaitez remplir une liste avec les événements d'un flux observable, vous devez créer une liste et ajouter les éléments dans une méthode Subscribe comme so (C #):

IObservable<EventType> myObservable = ...;
var list = new List<EventType>();
myObservable.Subscribe(evt => list.Add(evt));

Les opérateurs de style ToList- fournissent uniquement une liste une fois le flux terminé (en tant que IObservable<List<T>>), ce qui n'est donc pas utile dans les scénarios dans lesquels vous avez un flux de longue durée ou souhaitez afficher des valeurs avant la fin du flux.

0
Schneider

Cela pourrait être une réponse tardive, espérons que cela aidera quelqu'un à l'avenir.

Il y a un opérateur collectInto(). Je suggérerais à tout le monde de ne pas utiliser blocking() (sauf en cas de test) car vous perdriez complètement le but des événements asynchrones dans Rxchains. Essayez d'enchaîner vos opérations autant que possible

Completable setList(List<Integer> newIntegerList, Observable<Integer> observable){
   return observable.collectInto(newIntegerList, List::add).ignoreElement();
}

 // Can call this method
 Observable<Integer> observable = Observable.just(1, 2, 3);
 List<Integer> list = new ArrayList<>();
 setList(list, observable);

Vous évitez ainsi d'avoir à utiliser blocking() dans ce cas. 

0
Shubham Srivastava