繁体   English   中英

将 observable 转换为列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM