thenApply
und thenCompose
sind Methoden von CompletableFuture
. Verwenden Sie sie, wenn Sie beabsichtigen, mit a etwas zum CompleteableFuture
Ergebnis zu führen Function
.
thenApply
und thenCompose
beide geben a CompletableFuture
als ihr eigenes Ergebnis zurück. Sie können mehrere thenApply
oder thenCompose
zusammen verketten. Geben Sie Function
für jeden Anruf ein an, dessen Ergebnis die Eingabe für den nächsten sein wird Function
.
Das von Function
Ihnen gelieferte muss manchmal etwas synchron machen. Der Rückgabetyp von Function
sollte ein Nicht- Future
Typ sein. In diesem Fall sollten Sie verwenden thenApply
.
CompletableFuture.completedFuture(1)
.thenApply((x)->x+1) // adding one to the result synchronously, returns int
.thenApply((y)->System.println(y)); // value of y is 1 + 1 = 2
In anderen Fällen möchten Sie möglicherweise eine asynchrone Verarbeitung durchführen Function
. In diesem Fall sollten Sie verwenden thenCompose
. Der Rückgabetyp Ihres Function
sollte a sein CompletionStage
. Der nächste Function
in der Kette erhält das Ergebnis CompletionStage
als Eingabe und wickelt so das aus CompletionStage
.
// addOneAsync may be implemented by using another thread, or calling a remote method
abstract CompletableFuture<Integer> addOneAsync(int input);
CompletableFuture.completedFuture(1)
.thenCompose((x)->addOneAsync(x)) // doing something asynchronous, returns CompletableFuture<Integer>
.thenApply((y)->System.println(y)); // y is an Integer, the result of CompletableFuture<Integer> above
Dies ist eine ähnliche Idee wie bei Javascript Promise
. Promise.then
kann eine Funktion akzeptieren, die entweder einen Wert oder Promise
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
und Function<? super T,? extends CompletionStage<U>> fn
gelten als der gleiche Runtime-Typ - Function
. Daher thenApply
und thenCompose
müssen eindeutig benannt werden, sonst würde sich der Java-Compiler über identische Methodensignaturen beschweren. Das Endergebnis ist, dass Javascript Promise.then
in zwei Teilen implementiert ist - thenApply
und thenCompose
- in Java.
Du kannst lesen meine andere Antwort , wenn Sie auch über eine verwandte Funktion verwirrt sind thenApplyAsync
.
map
undflatMap
inStream
?thenApply
ist dasmap
undthenCompose
ist dasflatMap
vonCompletableFuture
. Sie verwendenthenCompose
, um zu vermeidenCompletableFuture<CompletableFuture<..>>
.