Mam 3 CompletableFutures wszystkie 3 zwracające różne typy danych.Java 8 Completable Futures allOf różnych typów danych
Szukam utworzyć obiekt wynikowy, który jest składem wyniku zwróconego przez wszystkie 3 kontrakty terminowe.
Więc mój obecny kodeks pracy wygląda następująco:
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;
}
Moje pytania są następujące:
Moim założeniem jest to, że ponieważ używam
allOf
ithenAcceptAsync
to wezwanie będzie zakaz blokowania. Czy moje zrozumienie jest właściwe?Czy jest to właściwy sposób radzenia sobie z wieloma kontraktami terminowymi, które zwracają różne typy wyników?
Czy słusznie jest skonstruować obiekt
ClassD
w obrębiethenAcceptAsync
?- Czy jest właściwe stosowanie metody
join
lubgetNow
w lambda ThenAcceptAsync?
dzięki za szczegółową odpowiedź. Moja jedyna odpowiedź na twoją odpowiedź brzmi, że thenApplyAsync ma typ zwrotu CompletableFuture, jak by to działało tutaj i jak by jeden powoływać się na tę metodę i spożywać wynik –
Nie, jest to typ zwrotu 'allOf', który jest" CompletableFuture ' , dlatego funkcja przekazana 'thenApplyAsync' otrzymuje' Void' jako dane wejściowe (powyższy parametr 'dummy', zamiast' dummy -> ', możesz również napisać' (Puste manekiny) -> '). Następnie funkcja tłumaczy wejście 'Void' (przez jego ignorowanie) na wynik' ClassD', więc wynikiem 'thenApplyAsync' będzie' CompletableFuture '. –
Holger
@Holger Miałem podobną trasę do ciebie, ale używałem Opcjonalnego.Niepełnego w wywołaniach serwisowych, więc możesz mieć 'cCFuture.join(). IfPresent (class :: SetStuff)' – Ash