Подтвердить что ты не робот

Преобразовать наблюдаемые в список

Я использую RxJava.

У меня есть Observable<T>. Как преобразовать его в List<T>?

Кажется, это простая операция, но я не мог найти ее где-нибудь в сети.

4b9b3361

Ответ 1

Вы можете использовать toList() или toSortedList(). Например,

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

Ответ 2

Надеюсь, что это поможет.

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

спасибо

anand raman

Ответ 3

RxJava 2 +:

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

Ответ 4

Вы также можете использовать оператор collect:

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

С помощью функции collect можно выбрать тип Collection вы предпочитаете, и выполнить дополнительную операцию с элементом, прежде чем добавить его в список.

Ответ 5

Вы не можете преобразовать наблюдаемые в список любым идиоматическим способом, потому что список не является типом, который вписывается в Rx.

Если вы хотите заполнить список событиями из наблюдаемого потока, вам нужно в основном создать список и добавить элементы в метод Subscribe, например, (С#):

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

Операторы ToList -style предоставляют список только после завершения потока (как IObservable<List<T>>), поэтому это не полезно в сценариях, где у вас долгоживущий поток или вы хотите видеть значения до завершения потока.

Ответ 6

Это может быть поздний ответ, надеюсь, он поможет кому-нибудь в будущем.

Есть оператор collectInto(). Я бы посоветовал всем не использовать blocking() (если не в тестовом примере), поскольку вы полностью теряете цель асинхронных событий в Rxchains. Постарайтесь максимально упорядочить свои операции

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);

В этом случае вы избавляете от необходимости использовать blocking().

Ответ 7

Нашел сам

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;
}