2016-03-05 35 views
20

Java 8 ha una funzione CompletableFuture.allOf(CompletableFuture<?>...cfs) che restituisce un CompletableFuture completato quando tutti i futuri dati sono completi.Java 8 CompletableFuture.allOf (...) con Collection o List

Tuttavia, quasi sempre non mi occupo di un array di CompletableFuture s, ma invece di un List<CompletableFuture>. Certo, posso usare il metodo toArray(), ma questo finisce per essere un po 'un problema dover continuamente convertire avanti e indietro tra array e liste.

Sarebbe davvero bello se ci fosse un modo intelligente di ottenere un CompletableFuture<List<T>> in cambio di un List<CompletableFuture<T>>, invece di dover continuamente creare una creazione di un array intermedio. Qualcuno conosce un modo per farlo in Java 8?

risposta

12

Sfortunatamente, per quanto ne so, i futures completi non supportano le raccolte.

Si potrebbe fare qualcosa di simile per rendere il codice un po 'più pulito, ma lo fa essenzialmente la stessa cosa:

public <T> CompletableFuture<List<T>> allOf(List<CompletableFuture<T>> futuresList) { 
    CompletableFuture<Void> allFuturesResult = 
    CompletableFuture.allOf(futuresList.toArray()); 
    return allFuturesResult.thenApply(v -> 
      futuresList.stream(). 
        map(future -> future.join()). 
        collect(Collectors.<T>toList()) 
    ); 
} 

trovato questo molto istruttiva: http://www.nurkiewicz.com/2013/05/java-8-completablefuture-in-action.html

+3

Usa 'CompletableFuture.allOf (futuresList. toArray (new CompletableFuture [futuresList.size()])) 'dal momento che CompletableFuture.allOf() prende una matrice di' CompletableFuture'. – wz366

+1

@ wz366 funziona ma ricevo un avviso da IntelliJ su 'new CompletableFuture [futuresList.size()]' dicendo 'Array di tipo Oggetto []' atteso – Kousha