Как объединить список Завершаемых задач в один Завершаемый результат?

У меня есть метод, который возвращает Single<List<Item>>, и я хотел бы взять каждый элемент в этом списке и передать его нижестоящему методу, который возвращает Completable. Я хочу дождаться успешного завершения каждого элемента и вернуть результат Completable. Мой первоначальный подход состоял в том, чтобы обрабатывать каждый элемент отдельно, используя flatMapIterable, и объединять результаты, используя toList, но я не могу вызывать toList для объекта Completable. Есть ли какой-либо другой способ таким образом «объединить» множество Completable задач в одну Completable? Вот что у меня есть до сих пор:

public Single<List<Item>> getListOfItems() {
    ...
}

public Completable doSomething(Item item) {
    ...
}

public Completable processItems() {
    return getListOfItems()     
        .toObservable()
        .flatMapIterable(items -> items)
        .flatMapCompletable(item -> doSomething(item))
        .toList()    // ERROR: No method .toList() for Completable
        .ignoreElements();
}

person cascal    schedule 22.08.2017    source источник


Ответы (1)


Оператор flatMapCompletable делает свое дело, вам не нужно применять дополнительные операторы.

Из документов:

Сопоставляет каждый элемент вышестоящего Observable с CompletableSources, подписывается на них и ждет завершения вышестоящего и всех CompletableSources.

flatMapCompletable вернет Completable, которое завершится, когда все сопоставленные Completables завершат свою работу:

 public Completable processItems() {
    return getListOfItems()
            .toObservable()
            .flatMapIterable(items -> items)
            .flatMapCompletable(item -> doSomething(item));
}
person yosriz    schedule 22.08.2017
comment
Понятно, я как-то неправильно истолковал то, что говорили документы. Большое спасибо! - person cascal; 22.08.2017