将observable转换为list

时间:2014-10-11 05:39:58

标签: java rx-java reactive-programming

我正在使用RxJava。

我有Observable<T>。如何将其转换为List<T>

似乎是一个简单的操作,但我无法在网上的任何地方找到它。

8 个答案:

答案 0 :(得分:73)

希望这有帮助。

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

感谢

anand raman

答案 1 :(得分:23)

您可以使用toList()toSortedList()。例如,

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

答案 2 :(得分:11)

RxJava 2 +:

localhost:myproject nataliab$ 00~on the next01~

答案 3 :(得分:3)

您还可以使用collect运算符:

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

使用collect,您可以选择自己喜欢的Collection类型,并在将其添加到列表中之前对该项执行其他操作。

答案 4 :(得分:1)

这有效。

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();
        }
    };
}`

答案 5 :(得分:0)

您不能以任何惯用的方式将observable转换为list,因为列表实际上不是适合Rx的类型。

如果要使用来自可观察流的事件填充列表,您需要基本上创建一个列表并在Subscribe方法中添加项目,如此(C#):

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

ToList - 样式的运算符只在流完成后提供一个列表(作为IObservable<List<T>>),因此在您拥有长期流或您想要查看值的情况下这不是很有用在流完成之前。

答案 6 :(得分:0)

这可能是一个较晚的答案,希望对将来有所帮助。

有一个运算符INSERT INTO `messages` ( `m_title`, `m_details`) SELECT m_title, m_details from temp_messages where id =2 。我建议大家不要使用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); 的麻烦。

答案 7 :(得分:-13)

自己找到

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