2017-10-09 10 views
4

J'utilise des contrats à terme réalisables en java 8 et je veux écrire une méthode qui, en fonction d'un paramètre reçu, exécute plusieurs tâches avec effets secondaires en parallèle puis retourner leur avenir "combiné" (en utilisant CompletableFuture.allOf()), ou ne rien faire et renvoie un futur déjà rempli.Quelle est la manière correcte de créer un CompletableFuture déjà complété <Void>

Cependant, allOf retourne un CompletableFuture<Void>:

public static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs) 

Et la seule façon de créer un avenir déjà rempli qui savent utilise completedFuture(), qui attend une valeur:

public static <U> CompletableFuture<U> completedFuture(U value) 

Retours un nouveau CompletableFuture déjà complété avec la valeur donnée.

et Void est uninstantiable, donc je besoin d'une autre façon de créer un avenir déjà rempli de type CompletableFuture<Void>.

Quelle est la meilleure façon de faire cela?

+2

Vous ne pouvez pas simplement 'CompletableFuture. (nul) '? – lexicore

Répondre

4

Depuis Void ne peut pas être instancié, vous ne pouvez remplir un CompletableFuture<Void> avec un résultat null, ce qui est exactement ce que vous aussi obtiendrez lors de l'appel join() sur l'avenir est revenu par allOf() une fois qu'il a été complété avec succès.

, vous pouvez utiliser

CompletableFuture<Void> cf = CompletableFuture.completedFuture(null); 

pour obtenir un tel avenir déjà terminé.

Mais vous pouvez également utiliser

CompletableFuture<Void> cf = CompletableFuture.allOf(); 

pour indiquer qu'il n'y a pas d'emploi le résultat dépend. Le résultat sera exactement le même.

8

passer un null je suppose:

CompletableFuture<Void> done = CompletableFuture.completedFuture(null);