Java 将可观察的转换为列表

Java 将可观察的转换为列表,java,rx-java,reactive-programming,Java,Rx Java,Reactive Programming,我正在使用RxJava 我有一个可观察的。如何将其转换为列表 这似乎是一个简单的操作,但我在网上的任何地方都找不到它。您可以使用或。例如 observable.toList(myObservable) .subscribe({ myListOfSomething -> do something useful with the list }); 我自己找到的 public static <T> List<T> toList(Observable&

我正在使用RxJava

我有一个可观察的
。如何将其转换为
列表

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

您可以使用或。例如

observable.toList(myObservable)
          .subscribe({ myListOfSomething -> do something useful with the list });
我自己找到的

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;
}
公共静态列表列表列表(可观察){
最终列表=新的ArrayList();
observable.toBlocking().forEach(新操作1(){
@凌驾
公开作废通知(T){
列表。添加(t);
}
});
退货清单;
}
希望这有帮助

List myList=myObservable.toList().toBlocking().single()

谢谢

anand raman

RxJava 2+:

List<T> = theObservarale
             .toList()
             .blockingGet();
List=观察者
托利斯先生()
.blockingGet();

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

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

IObservable myobbservable=。。。;
var list=新列表();
myObservable.Subscribe(evt=>list.Add(evt));

ToList
-类型的运算符仅在流完成后提供一个列表(作为
IObservable
),因此在流存在很长时间或希望在流完成之前查看值的情况下,该运算符没有用。

您还可以使用
collect
运算符:

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

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

这可能是一个迟来的答案,希望将来能对某人有所帮助

有一个操作符
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);
Completable setList(List newIntegerList,Observable){
返回observable.collectInto(newIntegerList,List::add).ignoreElement();
}
//可以调用此方法
可观察的可观察的=可观察的。刚好(1,2,3);
列表=新的ArrayList();
设置列表(列表,可观察);
在这种情况下,可以省去使用
blocking()
的麻烦

这是有效的

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();
        }
    };
}`
publicstaticvoidmain(字符串[]args){
可观察。只是(“这”、“是”、“如何”、“你”、“做”、“它”)
.lift(customToList())
.subscribe(strings->System.out.println(String.join(“,strings));
}
公共静态ObserveOperator自定义列表(){
返回观察者->新建可处置观察者(){
ArrayList ArrayList=新的ArrayList();
@凌驾
下一页(T){
arrayList.add(t);
}
@凌驾
公共作废登记员(可丢弃){
观察者:一个错误(可丢弃);
}
@凌驾
未完成的公共空间(){
observer.onNext(arrayList);
observer.onComplete();
}
};
}`

这有点反模式。改为使用
Observable.toList()
,并确保
Observable
不是无限的,否则您将遇到问题。正如Thomas所说,您可能需要重新考虑接受此选项,这不是解决问题的方法。这不会将其转换为列表。这与我调用的
subscribe
基本相同。还要注意的是,toList()只在序列完成时创建列表,因此对于长时间运行的流没有用处。它将导致阻塞,而不是asyn@ZulqurnainJutt-电话铃响了吗?(问题并不要求它是异步的)collect可以使用方法引用编写,如
collect(ArrayList::new,ArrayList::add)
谢谢提示,这里没有使用方法引用。这只返回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();
        }
    };
}`