Wie kombiniere 3 oder mehr CompletionStages?
Wenn 2 CompletionStages kann ich kombinieren Sie mit thenCombine
Methode:
CompletionStage<A> aCompletionStage = getA();
CompletionStage<B> bCompletionStage = getB();
CompletionStage<Combined> combinedCompletionStage =
aCompletionStage.thenCombine(bCompletionStage, (aData, bData) -> combine(aData, bData));
Wenn ich 3 oder mehr CompletionStages ich kann eine Kette von thenCombine
Methoden, aber ich habe eine temporäre Objekte übergeben die Ergebnisse. Zum Beispiel, hier ist eine Lösung mit Pair
und Triple
von der org.apache.commons.lang3.tuple
Paket:
CompletionStage<A> aCompletionStage = getA();
CompletionStage<B> bCompletionStage = getB();
CompletionStage<C> cCompletionStage = getC();
CompletionStage<D> dCompletionStage = getD();
CompletionStage<Combined> combinedDataCompletionStage =
aCompletionStage.thenCombine(bCompletionStage, (Pair::of))
.thenCombine(cCompletionStage, (ab, c) ->
Triple.of(ab.getLeft(), ab.getRight(), c))
.thenCombine(dCompletionStage, (abc, d) ->
combine(abc.getLeft(), abc.getMiddle(), abc.getRight(), d));
Gibt es eine bessere Art und Weise zu kombinieren, die Ergebnisse von mehreren CompletionStages?
- Ich verstehe nicht, was Sie zu tun versuchen. Was ist Ihre
combine
Methode? Was ist Ihr Zweck? Was willst du mit derCompletionStage
s? Wer ist der Verbraucher am Ende? Was sollte die Folge sein, die Sie erhalten? combine
ist eine Funktion, die 4 Parameter und Rückgabe 1Combined
. Der Verbraucher kann zum Beispiel eine andere Funktion, dieCombined
als parameter und Rückgabe einem anderenCompletionStage
, die aufgerufen wird, mitcombinedDataCompletionStage.thenCompose(...)
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur so kombinieren Sie mehrere Phasen, die skaliert gut mit einer wachsenden Zahl von Stufen, ist die Verwendung
CompletableFuture
. Wenn IhrCompletionStage
s nichtCompletableFuture
s können Sie immer noch wandeln Sie mit.toCompletableFuture()
:Diese enthält mehr boilerplate als die Kombination von zwei Stufen über
thenCombine
aber der Standardcode nicht wachsen, wenn das hinzufügen von mehr Phasen es.Beachten Sie, dass auch Sie mit Ihrer ursprünglichen
thenCombine
Ansatz, brauchen Sie nicht eineTriple
einePair
ist ausreichend:Dennoch ist es nicht gut zu skalieren, wenn Sie möchten, kombinieren Sie mehrere Stufen.
Einem in-zwischen-Lösung (in Bezug auf Komplexität) könnte sein:
Dass ist einfacher in seiner Struktur aber immer noch nicht gut zu skalieren mit mehr Stufen.
Holger die Dritte Antwort gemacht werden können, ein wenig kürzer:
Ich denke, Sie sollten ein zwischengeschaltetes Objekt, sondern Ihren eigenen statt mit
Pair
undTuple
Die tatsächliche form der Ergebnis-Halter können sich offensichtlich ändern sich entsprechend Ihrer eigenen Bedürfnisse, was Ihnen eine größere Flexibilität. Sie erhalten auch verantwortlich sein, was geschieht, wenn diese futures abgeschlossen. Obwohl es mehr boilerplate, erhalten Sie code, der mehr beschreibenden, was geschehen ist (was lombok können Aufräumen).
Sie gefragt haben "3 oder mehr", wenn Sie Ihnen in einer Liste als CompletableFutures (siehe andere Antworten), können Sie mit diesem handlichen Methode:
Konvertiert es Ihre "Liste der futures", um eine "Zukunft, für eine Liste der Ergebnisse".
Ich hatte ein ähnliches problem, hatte aber mehr als 3 completablefutures also Gebäude bis auf Holger s Antwort machte ich eine kleine generische utility.