2015-12-04 28 views
6

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>?

+2

Wymagałoby to wcześniejszego utworzenia "listy", nawet jeśli osoba dzwoniąca nigdy jej nie zapyta. – Holger

Odpowiedz

5

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

+0

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