RxJava - один из списка <T>для завершения - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть:
Single<List<T>>

Я хочу одновременно запустить один метод для всего списка и другой метод для каждого элемента списка.Эти два метода возвращают void, так что, наконец, я хочу получить Completable, который будет завершен, когда все вызовы метода (n + 1) будут успешными.Все n + 1 вызовы должны выполняться одновременно.

Как этого добиться?

1 Ответ

0 голосов
/ 07 декабря 2018

Я думаю, вам нужно что-то вроде этого

У вас есть 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());
                }
            });
...