Convertir observable en liste

j'utilise RxJava.

j'ai un Observable<T>. Comment puis-je convertir List<T>?

semble être une opération simple, mais je n'ai pas pu le trouver n'importe où sur le net.

35
demandé sur Schneider 2014-10-11 09:39:57

6 réponses

Vous pouvez utiliser toList() ou toSortedList () . Pour, par exemple,

observable.toList(myObservable)
          .subscribe({ myListOfSomething -> do something useful with the list });
23
répondu sol4me 2014-11-03 21:05:56

Espérons que cette aide.

List<T> myList = myObservable.toList().toBlocking().single();

merci

anand raman

71
répondu diduknow 2014-10-12 13:20:27

RxJava 2+:

List<T> = theObservarale
             .toList()
             .blockingGet();
7
répondu Andrey 2017-06-30 21:21:56

vous pouvez aussi utiliser le collect opérateur:

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

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

2
répondu araknoid 2018-01-25 22:54:10

vous ne pouvez pas convertir observable en liste de façon idiomatique, parce qu'une liste n'est pas vraiment un type qui correspond à Rx.

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

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

ne fournissent une liste qu'une fois le flux terminé (en tant que IObservable<List<T>>), ce qui n'est donc pas utile dans les scénarios où vous avez un flux de longue durée ou vous voulez voir les valeurs avant la fin du flux.

0
répondu Schneider 2017-07-07 03:02:57

Trouvé moi-même

public static <T> List<T> toList(Observable<T> observable) {
    final List<T> list = new ArrayList<T>();

    observable.toBlocking().forEach(new Action1<T>() {
        @Override
        public void call(T t) {
            list.add(t);
        }
    });

    return list;
}
-13
répondu Khanh Nguyen 2014-10-11 10:59:19