Я использую RxJava.
У меня есть Observable<T>
. Как преобразовать его в List<T>
?
Кажется, это простая операция, но я не мог найти ее где-нибудь в сети.
Я использую RxJava.
У меня есть Observable<T>
. Как преобразовать его в List<T>
?
Кажется, это простая операция, но я не мог найти ее где-нибудь в сети.
Вы можете использовать toList() или toSortedList(). Например,
observable.toList(myObservable)
.subscribe({ myListOfSomething -> do something useful with the list });
Надеюсь, что это поможет.
List<T> myList = myObservable.toList().toBlocking().single();
спасибо
anand raman
RxJava 2 +:
List<T> = theObservarale
.toList()
.blockingGet();
Вы также можете использовать оператор collect
:
ArrayList list = observable.collect(ArrayList::new, ArrayList::add)
.toBlocking()
.single();
С помощью функции collect
можно выбрать тип Collection
вы предпочитаете, и выполнить дополнительную операцию с элементом, прежде чем добавить его в список.
Вы не можете преобразовать наблюдаемые в список любым идиоматическим способом, потому что список не является типом, который вписывается в Rx.
Если вы хотите заполнить список событиями из наблюдаемого потока, вам нужно в основном создать список и добавить элементы в метод Subscribe
, например, (С#):
IObservable<EventType> myObservable = ...;
var list = new List<EventType>();
myObservable.Subscribe(evt => list.Add(evt));
Операторы ToList
-style предоставляют список только после завершения потока (как IObservable<List<T>>
), поэтому это не полезно в сценариях, где у вас долгоживущий поток или вы хотите видеть значения до завершения потока.
Это может быть поздний ответ, надеюсь, он поможет кому-нибудь в будущем.
Есть оператор 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()
.
Нашел сам
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;
}