web-dev-qa-db-fra.com

Quelle est la bonne façon de créer un CompletableFuture déjà terminé <Void>

J'utilise des contrats à terme complétables dans Java 8 et je veux écrire une méthode qui, en fonction d'un paramètre reçu, exécute plusieurs tâches avec des effets secondaires en parallèle, puis retourne leur avenir "combiné" ( en utilisant CompletableFuture.allOf()), ou ne fait rien et retourne un futur déjà terminé.

Cependant, allOf renvoie un CompletableFuture<Void>:

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

Et la seule façon de créer un futur déjà terminé qui sait est d'utiliser completedFuture(), qui attend une valeur:

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

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

et Void n'est pas instable, j'ai donc besoin d'un autre moyen pour créer un futur déjà terminé de type CompletableFuture<Void>.

Quelle est la meilleure façon de procéder?

17
Roy Menczer

Puisque Void ne peut pas être instancié, vous ne pouvez compléter un CompletableFuture<Void> Qu'avec un résultat null, ce qui est exactement ce que vous obtiendrez également lors de l'appel de join() sur le futur retourné par allOf() une fois qu'il a été complété avec succès.

Vous pouvez donc utiliser

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

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

Mais vous pouvez également utiliser

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

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

18
Holger

passer un null je suppose:

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