2016-03-05 24 views
20

Java 8 ma funkcję CompletableFuture.allOf(CompletableFuture<?>...cfs), która zwraca wartość CompletableFuture, która jest wykonywana po zakończeniu wszystkich danych kontraktów futures.Java 8 CompletableFuture.allOf (...) z kolekcją lub listą

Jednak prawie zawsze nie mam do czynienia z tablicą CompletableFuture s, ale zamiast tego mam List<CompletableFuture>. Oczywiście, mogę użyć metody toArray(), ale to jest trochę trudu, aby ciągle konwertować między tablicami i listami.

Byłoby naprawdę fajnie, gdyby istniała sprytna metoda uzyskania CompletableFuture<List<T>> w zamian za List<CompletableFuture<T>>, zamiast ciągłego tworzenia pośredniej tablicy. Czy ktoś wie sposób to zrobić w Java 8?

Odpowiedz

12

Niestety, według mojej wiedzy, kompletna przyszłość nie obsługuje zbiorów.

Można zrobić coś takiego, aby kod nieco czystsze, ale to w zasadzie robi to samo:

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()) 
    ); 
} 

że to bardzo pouczające: http://www.nurkiewicz.com/2013/05/java-8-completablefuture-in-action.html

+3

użyć 'CompletableFuture.allOf (futuresList. toArray (new CompletableFuture [futuresList.size()])) 'ponieważ CompletableFuture.allOf() przyjmuje tablicę' CompletableFuture'. – wz366

+1

@ wz366 działa to, ale otrzymuję ostrzeżenie od IntelliJ na temat 'new CompletableFuture [futuresList.size()]' powiedzenie 'Array of type Object []' expected – Kousha