web-dev-qa-db-ja.com

オブザーバブルをリストに変換する

RxJavaを使用しています。

Observable<T>があります。 List<T>に変換するにはどうすればよいですか?

簡単な操作のように思えますが、ネット上のどこにも見つけることができませんでした。

37
Khanh Nguyen

toList() または toSortedList() を使用できます。たとえば.

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

お役に立てれば。

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

ありがとう

アナンド・ラマン

74
diduknow

RxJava 2+:

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

collect演算子も使用できます。

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

collectを使用すると、希望するCollectionのタイプを選択し、アイテムをリストに追加する前に追加の操作を実行できます。

4
araknoid

リストは実際にはRxに適合するタイプではないため、Observableをリストに変換することはできません。

監視可能なストリームからのイベントをリストに追加する場合は、基本的にリストを作成し、Subscribeメソッド内にアイテムを追加する必要があります(C#):

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

ToListスタイルの演算子は、ストリームが完了するとリストを提供します(IObservable<List<T>>)。これは、長期間存続するストリームがある場合や、ストリームが完了する前に値を確認したい場合には役立ちません。

0
Schneider

これは遅い答えかもしれません、将来それが誰かを助けることを願っています。

演算子collectInto()があります。 Rxchainsの非同期イベントの目的を完全に失うため、誰もblocking()を使用しないことをお勧めします(テストケースの場合を除く)。可能な限り操作を連鎖させてください

_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()を使用する手間を省きます。

0