web-dev-qa-db-ja.com

Java 8 CompletableFuture.allOf(...)with CollectionまたはList

Java 8には、 CompletableFuture.allOf(CompletableFuture<?>...cfs) という関数があり、指定されたすべてのフューチャーが完了すると完了するCompletableFutureを返します。

ただし、ほとんど常にCompletableFuturesの配列を扱っているのではなく、代わりにList<CompletableFuture>を持っています。もちろん、toArray()メソッドを使用することもできますが、これは配列とリストの間で絶えず変換する必要があるため、少し苦痛になります。

CompletableFuture<List<T>>と引き換えにList<CompletableFuture<T>>を取得するための滑らかな方法があれば、絶えず中間配列の作成をスローするのではなく、本当に素晴らしいでしょう。 Java 8でこれを行う方法を知っている人はいますか?

40
therealrootuser

残念ながら、私の知る限り、CompletableFutureはコレクションをサポートしていません。

コードを少しきれいにするためにこのようなことをすることができますが、それは本質的に同じことをします

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

28
Deepak