thenApplyi thenComposesą metodami CompletableFuture. Używaj ich, jeśli zamierzasz zrobić coś, aby uzyskać CompleteableFuturewynik za pomocą Function.
thenApplyi thenComposeoba zwracają CompletableFuturejako własny wynik. Możesz łączyć wiele thenApplylub thenComposerazem. Podaj a Functiondo każdego wywołania, którego wynik będzie wejściem do następnego Function.
To, Functionco dostarczyłeś, czasami musi zrobić coś synchronicznie. Zwracany typ nie Functionpowinien być Futuretypem. 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 Functionpowinien być a CompletionStage. Następny Functionw łańcuchu otrzyma wynik tego CompletionStagejako 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.thenmoże akceptować funkcję, która zwraca wartość lub a Promisez wartości. Powodem, dla którego te dwie metody mają różne nazwy w Javie, jest ogólne wymazywanie . Function<? super T,? extends U> fni Function<? super T,? extends CompletionStage<U>> fnsą uważane za ten sam typ środowiska wykonawczego - Function. Dlatego thenApplyi thenComposemusi być wyraźnie nazwany, inaczej kompilator Java narzekałby na identyczne sygnatury metod. Efektem końcowym jest to, że JavaScript Promise.thenjest zaimplementowany w dwóch częściach - thenApplyi thenCompose- w Javie.
Możesz przeczytać moją drugą odpowiedź, jeśli nie masz pewności co do powiązanej funkcji thenApplyAsync.
mapiflatMapwStream?thenApplyjestmapithenComposejestflatMapzCompletableFuture. Używasz,thenComposeaby uniknąć posiadaniaCompletableFuture<CompletableFuture<..>>.