J'ai 3 CompletableFutures tous les 3 renvoyant différents types de données.Java 8 Futures pouvant être complétées tousDe différents types de données
Je cherche à créer un objet de résultat qui est une composition du résultat retourné par les 3 futurs.
donc mon code de travail actuel ressemble à ceci:
public ClassD getResultClassD() {
ClassD resultClass = new ClassD();
CompletableFuture<ClassA> classAFuture = CompletableFuture.supplyAsync(() -> service.getClassA());
CompletableFuture<ClassB> classBFuture = CompletableFuture.supplyAsync(() -> service.getClassB());
CompletableFuture<ClassC> classCFuture = CompletableFuture.supplyAsync(() -> service.getClassC());
CompletableFuture.allOf(classAFuture, classBFuture, classCFuture)
.thenAcceptAsync(it -> {
ClassA classA = classAFuture.join();
if (classA != null) {
resultClass.setClassA(classA);
}
ClassB classB = classBFuture.join();
if (classB != null) {
resultClass.setClassB(classB);
}
ClassC classC = classCFuture.join();
if (classC != null) {
resultClass.setClassC(classC);
}
});
return resultClass;
}
Mes questions sont les suivantes:
Mon hypothèse est que depuis que je suis en utilisant
allOf
etthenAcceptAsync
cet appel sera non blocage. Est-ce que je comprends bien?Est-ce la bonne façon de gérer des contrats à terme multiples renvoyant différents types de résultats?
Est-il correct de construire l'objet dans
thenAcceptAsync
?- Est-il approprié d'utiliser la méthode
join
ougetNow
dans lambda thenAcceptAsync?
merci pour la réponse détaillée. Mon seul suivi à votre réponse est que thenApplyAsync a un type de retour de CompletableFuture, comment cela fonctionnerait-il ici et comment invoquer cette méthode et consommer le résultat? –
Non, c'est le type de retour de 'allOf' qui est' CompletableFuture ' , c'est pourquoi la fonction passée 'thenApplyAsync' reçoit' Void' en entrée (le paramètre 'dummy' ci-dessus, au lieu de' dummy -> ', vous pouvez également écrire' (Void dummy) -> '). Ensuite, la fonction traduit l'entrée 'Void' (en l'ignorant réellement) en un résultat' ClassD', donc le résultat de 'thenApplyAsync' sera' CompletableFuture '. –
Holger
@Holger Je descendais un chemin similaire à vous mais j'utilisais Optional.ofNullable dans les appels de service, donc vous pouvez avoir 'cCFuture.join(). IfPresent (class :: SetStuff)' – Ash