web-dev-qa-db-fra.com

Java 8 CompletableFuture.allOf (...) avec Collection ou Liste

Java 8 a une fonction CompletableFuture.allOf(CompletableFuture<?>...cfs) qui renvoie un CompletableFuture qui est terminé lorsque tous les futurs donnés sont terminés.

Cependant, je n'ai presque toujours pas affaire à un tableau de CompletableFutures, mais plutôt à un List<CompletableFuture>. Bien sûr, je peux utiliser la méthode toArray(), mais cela devient un peu pénible de devoir constamment convertir en aller-retour entre tableaux et listes.

Ce serait vraiment bien s'il y avait un moyen astucieux d'obtenir un CompletableFuture<List<T>> En échange d'un List<CompletableFuture<T>>, Au lieu de devoir constamment lancer une création de tableau intermédiaire. Est-ce que quelqu'un connaît un moyen de faire cela dans Java 8?

40
therealrootuser

Malheureusement, à ma connaissance, CompletableFuture ne prend pas en charge les collections.

Vous pouvez faire quelque chose comme ceci pour rendre le code un peu plus propre, mais il fait essentiellement la même chose

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())
    );
}

J'ai trouvé ceci très informatif: http://www.nurkiewicz.com/2013/05/Java-8-completablefuture-in-action.html

28
Deepak