RxJava-List <t>的单个要完成

时间:2018-12-07 14:33:50

标签: rx-java rx-java2

我有:
Single<List<T>>

我想在整个列表上同时运行一个方法,在列表的每个元素上同时运行其他方法。这两个方法都返回void,所以最后我想拥有Completable,当所有方法调用(n + 1)成功完成时,它将完成。所有n + 1个调用应同时运行。

我该如何实现?

1 个答案:

答案 0 :(得分:2)

我认为您需要这样的东西

您有一个Single<List>(我用过Single<List<Integer>>)   说

Single<List<Integer>> listSingle = Single.fromCallable(() -> Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));

1:一个对Single<List<T>>

起作用的函数
public Completable doSomthingWithList(Single<List<Integer>> listSingle) {
    return listSingle.flatMapCompletable(intList -> Completable.fromAction(() -> {
        // do something with intList
        System.out.println("doSomthingWithList");
    })).subscribeOn(Schedulers.io()); // doing this in a background thread
}

2:另一个对列表中所有项目执行操作的功能

public Completable doSomethingForEachItemInList(Single<List<Integer>> listSingle) {
    return listSingle.flatMapObservable(Observable::fromIterable)
            .flatMapCompletable(integer -> Completable.fromAction(() -> {
                System.out.println("Doing somthing with list item " + integer);
            })).subscribeOn(Schedulers.io());
}

3:并行执行上述两个功能,并在两个功能完成时通知

 Completable.mergeArray(doSomthingWithList(listSingle), doSomethingForEachItemInList(listSingle))
            .subscribeWith(new DisposableCompletableObserver() {
                @Override
                public void onComplete() {
                    // all actions completed
                    System.out.println("All done!");
                }

                @Override
                public void onError(Throwable e) {
                    System.out.println(e.getMessage());
                }
            });