Java 8 CompletableFuture.allOf(…) mit Sammlung oder Liste [duplicate]

Lesezeit: 2 Minuten

Java 8 hat eine Funktion CompletableFuture.allOf(CompletableFuture<?>...cfs) das gibt a zurück CompletableFuture das ist abgeschlossen, wenn alle gegebenen Futures abgeschlossen sind.

Ich habe es jedoch fast immer nicht mit einer Reihe von zu tun CompletableFutures, sondern haben stattdessen a List<CompletableFuture>. Natürlich kann ich die verwenden toArray() Methode, aber das ist am Ende ein bisschen mühsam, ständig zwischen Arrays und Listen hin und her konvertieren zu müssen.

Es wäre wirklich schön, wenn es einen glatten Weg geben würde CompletableFuture<List<T>> im Austausch für ein List<CompletableFuture<T>>, anstatt ständig eine zwischengeschaltete Array-Erstellung einwerfen zu müssen. Kennt jemand eine Möglichkeit, dies in Java 8 zu tun?

Benutzer-Avatar
Deepak

Leider unterstützt CompletableFuture meines Wissens keine Sammlungen.

Sie könnten so etwas tun, um den Code etwas sauberer zu machen, aber es macht im Wesentlichen dasselbe

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

Finde das sehr informativ: http://www.nurkiewicz.com/2013/05/java-8-completablefuture-in-action.html

  • Verwenden CompletableFuture.allOf(futuresList.toArray(new CompletableFuture[futuresList.size()])) da CompletableFuture.allOf() ein Array von aufnimmt CompletableFuture.

    – wz366

    22. August 2017 um 21:30 Uhr


  • Ich verstehe den Vorteil der Verwendung nicht allOf in Kombination mit join Methode. Du könntest direkt schreiben return futuresList.stream().map(CompletableFuture::join).collect(Collectors.toList())

    – Olivier Boisse

    9. Mai 2018 um 22:14 Uhr


  • @OlivierBoissé es geht um Ausnahmen. Wenn einer Ihrer Futures mit Ausnahme abgeschlossen ist, wartet Ihr Code nicht auf den Abschluss aller Futures. Während allOf wird wie erwartet funktionieren.

    – Turbanoff

    12. Juli 2019 um 12:29 Uhr

  • @OlivierBoissé, wenn du schreibst return futuresList.stream().map(CompletableFuture::join).collect(Collectors.toList()); Sie warten genau an diesem Punkt auf die Vollendung aller Futures. Im Gegensatz, return CompletableFuture.allOf( futuresList.toArray(new CompletableFuture<?>[0])).thenApply(v -> futuresList.stream() .map(future -> future.join()) .collect(Collectors.<T>toList()) ); wartet nicht auf Futures, sondern gibt einen neuen Future zurück, der mit der Ergebnisliste vervollständigt wird, sobald alle Futures vervollständigt sind.

    – Holger

    29. November 2019 um 14:09 Uhr


  • Verwenden futuresList.toArray(new CompletableFuture[0]) Anstatt von futuresList.toArray(new CompletableFuture[futuresList.size()]) auf HotSpot 8. (stackoverflow.com/questions/174093/…)

    – ET-CS

    21. Mai 2020 um 5:42 Uhr

1227480cookie-checkJava 8 CompletableFuture.allOf(…) mit Sammlung oder Liste [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy