[英]Convert observable to list
我正在使用 RxJava。
我有一个Observable<T>
。 如何将其转换为List<T>
?
似乎是一个简单的操作,但我在网上的任何地方都找不到。
希望这可以帮助。
List<T> myList = myObservable.toList().toBlocking().single();
谢谢
阿南德拉曼
您可以使用toList()或toSortedList() 。 例如
observable.toList(myObservable)
.subscribe({ myListOfSomething -> do something useful with the list });
RxJava 2+:
List<T> = theObservarale
.toList()
.blockingGet();
您还可以使用collect
运算符:
ArrayList list = observable.collect(ArrayList::new, ArrayList::add)
.toBlocking()
.single();
使用collect
,您可以选择您喜欢的Collection
类型,并在将项目添加到列表之前对其执行附加操作。
您不能以任何惯用的方式将 observable 转换为列表,因为列表并不是真正适合 Rx 的类型。
如果要使用可观察流中的事件填充列表,您需要基本上创建一个列表并在Subscribe
方法中添加项目,如下所示 (C#):
IObservable<EventType> myObservable = ...;
var list = new List<EventType>();
myObservable.Subscribe(evt => list.Add(evt));
ToList
样式运算符仅在流完成后提供列表(作为IObservable<List<T>>
),因此在您拥有长期流或您希望在流完成之前查看值的情况下,这没有用。
这有效。
public static void main(String[] args) {
Observable.just("this", "is", "how", "you", "do", "it")
.lift(customToList())
.subscribe(strings -> System.out.println(String.join(" ", strings)));
}
public static <T> ObservableOperator<List<T>, T> customToList() {
return observer -> new DisposableObserver<T>() {
ArrayList<T> arrayList = new ArrayList<>();
@Override
public void onNext(T t) {
arrayList.add(t);
}
@Override
public void onError(Throwable throwable) {
observer.onError(throwable);
}
@Override
public void onComplete() {
observer.onNext(arrayList);
observer.onComplete();
}
};
}`
这可能是一个迟到的答案,希望它在未来对某人有所帮助。
有一个运算符collectInto()
。 我建议大家不要使用Rxchains
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.