Ich kann den Unterschied zwischen thenApply(
) und nicht verstehen thenCompose()
.
Könnte jemand einen gültigen Anwendungsfall bereitstellen?
Aus den Java-Dokumenten:
thenApply(Function<? super T,? extends U> fn)
Gibt eine neue zurück
CompletionStage
, die, wenn diese Stufe normal abgeschlossen ist, mit dem Ergebnis dieser Stufe als Argument für die angegebene Funktion ausgeführt wird.
thenCompose(Function<? super T,? extends CompletionStage<U>> fn)
Gibt eine neue zurück
CompletionStage
, die, wenn diese Phase normal abgeschlossen ist, mit dieser Phase als Argument für die angegebene Funktion ausgeführt wird.
Ich verstehe, dass das 2. Argument von thenCompose
die CompletionStage erweitert, wo thenApply
dies nicht der Fall ist.
Könnte jemand ein Beispiel geben, in welchem Fall ich thenApply
wann verwenden muss thenCompose
?
map
undflatMap
inStream
?thenApply
ist dasmap
undthenCompose
ist dasflatMap
vonCompletableFuture
. Sie verwendenthenCompose
, um zu vermeidenCompletableFuture<CompletableFuture<..>>
.map
undflatMap
und ich verstehe Ihren Standpunkt.Antworten:
thenApply
wird verwendet, wenn Sie eine synchrone Zuordnungsfunktion haben.thenCompose
wird verwendet, wenn Sie eine asynchrone Zuordnungsfunktion haben (dh eine, die a zurückgibtCompletableFuture
). Es wird dann eine Zukunft mit dem Ergebnis direkt zurückgeben und nicht eine verschachtelte Zukunft.quelle
.thenCompose(x -> CompletableFuture.supplyAsync(() -> x+1))
anstelle von verwenden.thenApplyAsync(x -> x+1)
? Synchron oder asynchron zu sein ist nicht der relevante Unterschied.CompletableFuture
, ist diesthenCompose
der Weg, um die Struktur zu reduzieren.thenApplyAsync
weil es nicht das ist, was Sie denken, dass es ist.Ich denke, die Antwort von @Joe C ist irreführend.
Lassen Sie mich versuchen, den Unterschied zwischen
thenApply
undthenCompose
anhand eines Beispiels zu erklären .Nehmen wir an, wir haben zwei Methoden:
getUserInfo(int userId)
undgetUserRating(UserInfo userInfo)
:Beide Methodenrückgabetypen sind
CompletableFuture
.Wir möchten
getUserInfo()
zuerst anrufen und nach AbschlussgetUserRating()
mit dem Ergebnis anrufenUserInfo
.getUserInfo()
Versuchen wir nach Abschluss der Methode beidethenApply
undthenCompose
. Der Unterschied liegt in den Rückgabetypen:thenCompose()
funktioniert wie Scala,flatMap
die verschachtelte Futures abflacht.thenApply()
gab die verschachtelten Futures so zurück, wie sie waren, aberthenCompose()
abgeflachtCompletableFutures
, damit es einfacher ist, mehr Methodenaufrufe an sie zu ketten.quelle
UserInfo
(dann ja) enthalten ist oder ob sie separat eingeholt werden muss, möglicherweise sogar kostspielig (dann nein).Die aktualisierten Javadocs in Java 9 werden wahrscheinlich helfen, es besser zu verstehen:
dann anwenden
<U> CompletionStage<U> thenApply(Function<? super T,? extends U> fn)
thenCompose
quelle
map
undflatMap
an erster Stelle.thenApply()
es einfach aufgerufenFunction.apply()
wird und dem Erstellen vonthenCompose()
Funktionen ein bisschen ähnlich ist.thenApply
undthenCompose
sind Methoden vonCompletableFuture
. Verwenden Sie sie, wenn Sie beabsichtigen, mit a etwas zumCompleteableFuture
Ergebnis zu führenFunction
.thenApply
undthenCompose
beide geben aCompletableFuture
als ihr eigenes Ergebnis zurück. Sie können mehrerethenApply
oderthenCompose
zusammen verketten. Geben SieFunction
für jeden Anruf ein an, dessen Ergebnis die Eingabe für den nächsten sein wirdFunction
.Das von
Function
Ihnen gelieferte muss manchmal etwas synchron machen. Der Rückgabetyp vonFunction
sollte ein Nicht-Future
Typ sein. In diesem Fall sollten Sie verwendenthenApply
.In anderen Fällen möchten Sie möglicherweise eine asynchrone Verarbeitung durchführen
Function
. In diesem Fall sollten Sie verwendenthenCompose
. Der Rückgabetyp IhresFunction
sollte a seinCompletionStage
. Der nächsteFunction
in der Kette erhält das ErgebnisCompletionStage
als Eingabe und wickelt so das ausCompletionStage
.Dies ist eine ähnliche Idee wie bei Javascript
Promise
.Promise.then
kann eine Funktion akzeptieren, die entweder einen Wert oderPromise
einen Wert zurückgibt . Der Grund, warum diese beiden Methoden in Java unterschiedliche Namen haben, liegt in der generischen Löschung .Function<? super T,? extends U> fn
undFunction<? super T,? extends CompletionStage<U>> fn
gelten als der gleiche Runtime-Typ -Function
. DaherthenApply
undthenCompose
müssen eindeutig benannt werden, sonst würde sich der Java-Compiler über identische Methodensignaturen beschweren. Das Endergebnis ist, dass JavascriptPromise.then
in zwei Teilen implementiert ist -thenApply
undthenCompose
- in Java.Du kannst lesen meine andere Antwort , wenn Sie auch über eine verwandte Funktion verwirrt sind
thenApplyAsync
.quelle