thenApply
і thenCompose
є методами CompletableFuture
. Використовуйте їх тоді, коли ви збираєтесь щось зробити CompleteableFuture
з результатом Function
.
thenApply
і thenCompose
обидва повертають a 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
має бути a 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<..>>
.