thenApply
e thenCompose
são métodos de CompletableFuture
. Use-os quando quiser fazer algo para obter CompleteableFuture
o resultado de a Function
.
thenApply
e thenCompose
ambos retornam a CompletableFuture
como seu próprio resultado. Você pode encadear vários thenApply
ou thenCompose
juntos. Forneça um Function
para cada chamada, cujo resultado será a entrada para a próxima Function
.
O que Function
você forneceu às vezes precisa fazer algo de forma síncrona. O tipo de retorno de seu Function
deve ser um não Future
tipo. Neste caso, você deve usar 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
Outras vezes, você pode querer fazer processamento assíncrono neste Function
. Nesse caso, você deve usar thenCompose
. O tipo de retorno de seu Function
deve ser a CompletionStage
. O próximo Function
na cadeia obterá o resultado disso CompletionStage
como entrada, desembrulhando o 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
Esta é uma ideia semelhante à do Javascript Promise
. Promise.then
pode aceitar uma função que retorna um valor ou Promise
de um valor. A razão pela qual esses dois métodos têm nomes diferentes em Java é devido ao apagamento genérico . Function<? super T,? extends U> fn
e Function<? super T,? extends CompletionStage<U>> fn
são considerados o mesmo tipo de tempo de execução - Function
. Portanto, thenApply
e thenCompose
deve ser nomeado de forma distinta, ou o compilador Java reclamaria sobre assinaturas de método idênticas. O resultado final é que o Javascript Promise.then
é implementado em duas partes - thenApply
e thenCompose
- em Java.
Você pode ler minha outra resposta se também estiver confuso sobre uma função relacionada thenApplyAsync
.
map
eflatMap
emStream
?thenApply
é omap
ethenCompose
é oflatMap
deCompletableFuture
. Você usathenCompose
para evitar terCompletableFuture<CompletableFuture<..>>
.