78

Java 8 には、指定されたすべての先物が完了すると完了するCompletableFuture.allOf(CompletableFuture<?>...cfs)a を返す関数があります。CompletableFuture

ただし、ほとんどの場合、 の配列を扱っているCompletableFutureのではなく、List<CompletableFuture>. もちろん、toArray()この方法を使用することはできますが、配列とリストの間で常に変換を行う必要があるため、これは少し面倒です。

中間配列の作成を常に投入する必要がなく、CompletableFuture<List<T>>a と引き換えに a を取得する巧妙な方法があれば、本当に素晴らしいことです。List<CompletableFuture<T>>Java 8でこれを行う方法を知っている人はいますか?

4

1 に答える 1

66

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

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

public <T> CompletableFuture<List<T>> allOf(List<CompletableFuture<T>> futuresList) {
    CompletableFuture<Void> allFuturesResult =
    CompletableFuture.allOf(futuresList.toArray(new CompletableFuture[futuresList.size()]));
    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

于 2016-03-05T04:11:43.120 に答える