thenApplyund thenComposesind Methoden von CompletableFuture. Verwenden Sie sie, wenn Sie beabsichtigen, mit a etwas zum CompleteableFutureErgebnis zu führen Function.
thenApplyund thenComposebeide geben a CompletableFutureals ihr eigenes Ergebnis zurück. Sie können mehrere thenApplyoder thenComposezusammen verketten. Geben Sie Functionfür jeden Anruf ein an, dessen Ergebnis die Eingabe für den nächsten sein wird Function.
Das von FunctionIhnen gelieferte muss manchmal etwas synchron machen. Der Rückgabetyp von Functionsollte ein Nicht- FutureTyp 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 Functionsollte a sein CompletionStage. Der nächste Functionin der Kette erhält das Ergebnis CompletionStageals 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.thenkann eine Funktion akzeptieren, die entweder einen Wert oder Promiseeinen 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> fnund Function<? super T,? extends CompletionStage<U>> fngelten als der gleiche Runtime-Typ - Function. Daher thenApplyund thenComposemüssen eindeutig benannt werden, sonst würde sich der Java-Compiler über identische Methodensignaturen beschweren. Das Endergebnis ist, dass Javascript Promise.thenin zwei Teilen implementiert ist - thenApplyund thenCompose- in Java.
Du kannst lesen meine andere Antwort , wenn Sie auch über eine verwandte Funktion verwirrt sind thenApplyAsync.
mapundflatMapinStream?thenApplyist dasmapundthenComposeist dasflatMapvonCompletableFuture. Sie verwendenthenCompose, um zu vermeidenCompletableFuture<CompletableFuture<..>>.