Java 8 CompletableFuture.allOf(...) с коллекцией или списком

Java 8 имеет функцию CompletableFuture.allOf(CompletableFuture<?>...cfs), которая возвращает CompletableFuture, которая завершается, когда все заданные фьючерсы завершаются.

Однако, я почти всегда не имею дело с массивом CompletableFuture s, но вместо этого имеет List<CompletableFuture>. Конечно, я могу использовать метод toArray(), но это заканчивается тем, что вам нужно постоянно конвертировать назад и вперед между массивами и списками.

Было бы неплохо, если бы был гладкий способ получить CompletableFuture<List<T>> в обмен на List<CompletableFuture<T>>, а не постоянно бросать в создание промежуточного массива. Кто-нибудь знает способ сделать это в Java 8?

Ответы

Ответ 1

К сожалению, насколько мне известно, готовые фьючерсы не поддерживают коллекции.

Вы можете сделать что-то вроде этого, чтобы сделать код немного более чистым, но он по сути делает то же самое:

public <T> CompletableFuture<List<T>> allOf(List<CompletableFuture<T>> futuresList) {
    CompletableFuture<Void> allFuturesResult =
    CompletableFuture.allOf(futuresList.toArray());
    return allFuturesResult.thenApply(v ->
            futuresList.stream().
                    map(future -> future.join()).
                    collect(Collectors.<T>toList())
    );
}

Нашел это очень информативное: http://www.nurkiewicz.com/2013/05/java-8-completablefuture-in-action.html