thenApply
i thenCompose
są metodami CompletableFuture
. Używaj ich, jeśli zamierzasz zrobić coś, aby uzyskać CompleteableFuture
wynik za pomocą Function
.
thenApply
i thenCompose
oba zwracają CompletableFuture
jako własny wynik. Możesz łączyć wiele thenApply
lub thenCompose
razem. Podaj a Function
do każdego wywołania, którego wynik będzie wejściem do następnego Function
.
To, Function
co dostarczyłeś, czasami musi zrobić coś synchronicznie. Zwracany typ nie Function
powinien być Future
typem. W takim przypadku powinieneś użyć 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
Innym razem możesz chcieć wykonać asynchroniczne przetwarzanie w tym Function
. W takim przypadku powinieneś użyć thenCompose
. Typ zwrotu Function
powinien być a CompletionStage
. Następny Function
w łańcuchu otrzyma wynik tego CompletionStage
jako dane wejściowe, tym samym rozpakowując plik 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
To jest podobny pomysł do Javascript Promise
. Promise.then
może akceptować funkcję, która zwraca wartość lub a Promise
z wartości. Powodem, dla którego te dwie metody mają różne nazwy w Javie, jest ogólne wymazywanie . Function<? super T,? extends U> fn
i Function<? super T,? extends CompletionStage<U>> fn
są uważane za ten sam typ środowiska wykonawczego - Function
. Dlatego thenApply
i thenCompose
musi być wyraźnie nazwany, inaczej kompilator Java narzekałby na identyczne sygnatury metod. Efektem końcowym jest to, że JavaScript Promise.then
jest zaimplementowany w dwóch częściach - thenApply
i thenCompose
- w Javie.
Możesz przeczytać moją drugą odpowiedź, jeśli nie masz pewności co do powiązanej funkcji thenApplyAsync
.
map
iflatMap
wStream
?thenApply
jestmap
ithenCompose
jestflatMap
zCompletableFuture
. Używasz,thenCompose
aby uniknąć posiadaniaCompletableFuture<CompletableFuture<..>>
.