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.
Vous pouvez utiliser toList () ou toSortedList () . Par exemple.
observable.toList(myObservable)
.subscribe({ myListOfSomething -> do something useful with the list });
RxJava 2+:
List<T> = theObservarale
.toList()
.blockingGet();
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.
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.
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.