Dlaczego CompletableFuture.allOf
jest zadeklarowany jako CompletableFuture<Void>
i nie zwraca kolekcji wyników lub czegoś innego? Myślę, że to był dobry pomysł, aby uzyskać CompletableFuture.anyOf
return CompletableFuture<Object>
, ale widzę, że te dwie metody są ze sobą połączone, więc jestem zdezorientowany tym, co powracają.Dlaczego funkcja CompletableFuture.allOf została zadeklarowana jako CompletableFuture <Void>?
Odpowiedz
anyOf
musi jakoś powiedzieć, jaki był wynik określonego CompletableFuture
, którego ukończenie wywołało anyOf
. Nie jest to konieczne w przypadku allOf
, ponieważ wiesz, które futures zakończono - wszystkie z nich.
allOf
(podobnie jak anyOf
) nie wymaga, aby wszystkie futures były tego samego typu. Więc jeśli miałaby zwrócić przyszłość kolekcji, musiałaby to być kolekcja Object
, która prawdopodobnie nie jest tym, czego chcesz.
Jeśli naprawdę chcesz mieć allOf
zwrócić przyszłość kolekcji, jest to dość proste do pisania własnych:
public static CompletableFuture<List<Object>> myAllOf(CompletableFuture<?>... futures) {
return CompletableFuture.allOf(futures)
.thenApply(x -> Arrays.stream(futures)
.map(f -> (Object) f.join())
.collect(toList())
);
}
Jeśli masz typ bezpieczny wersję tego problemu i trzeba konwertować kolekcję kontrakty futures pewnego rodzaju na przyszłość kolekcji tego samego typu, zobacz to pytanie dla kilku przykładów: List<Future> to Future<List> sequence
Dziękuję za wyjaśnienia, ale nie mogę zrozumieć, dlaczego 'allOf' nie może zwrócić strumienia CompletableFuture lub wyników lub coś jeszcze ... – Everv0id
Wymagałoby to wcześniejszego utworzenia "listy", nawet jeśli osoba dzwoniąca nigdy jej nie zapyta. – Holger