thenApply
и thenCompose
являются методами CompletableFuture
. Используйте их, когда намереваетесь сделать что-то, чтобы добиться CompleteableFuture
результата с помощью Function
.
thenApply
и thenCompose
оба возвращают CompletableFuture
как свой собственный результат. Вы можете объединить несколько thenApply
или thenCompose
вместе. Поставьте a Function
для каждого вызова, результат которого будет вводом для следующего Function
.
Предоставленному Function
вами иногда необходимо что-то делать синхронно. Тип возврата вашего Function
должен быть не Future
типом. В этом случае вам следует использовать 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
В других случаях вы можете захотеть выполнить здесь асинхронную обработку Function
. В этом случае вам следует использовать thenCompose
. Тип возврата вашего Function
должен быть CompletionStage
. Следующий Function
в цепочке получит результат CompletionStage
как входной, таким образом разворачивая файл 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
Это похоже на идею Javascript Promise
. Promise.then
может принимать функцию, которая либо возвращает значение, либо Promise
значение. Причина, по которой эти два метода имеют разные имена в Java, связана с общим стиранием . Function<? super T,? extends U> fn
и Function<? super T,? extends CompletionStage<U>> fn
считаются одним и тем же типом среды выполнения - Function
. Таким образом, thenApply
и thenCompose
он должен быть четко назван, иначе компилятор Java будет жаловаться на идентичные сигнатуры методов. Конечным результатом является то, что Javascript Promise.then
реализован в двух частях - thenApply
и thenCompose
- в Java.
Вы можете прочитать мой другой ответ, если вас не смущает связанная функция thenApplyAsync
.
map
иflatMap
вStream
?thenApply
этоmap
иthenCompose
естьflatMap
изCompletableFuture
. Вы используете,thenCompose
чтобы избежатьCompletableFuture<CompletableFuture<..>>
.