thenApply
y thenCompose
son métodos de CompletableFuture
. Úselos cuando tenga la intención de hacer algo con CompleteableFuture
el resultado de to con a Function
.
thenApply
y thenCompose
ambos devuelven un CompletableFuture
como resultado. Puede encadenar varios thenApply
o thenCompose
juntos. Suministre a Function
a cada llamada, cuyo resultado será la entrada a la siguiente Function
.
El Function
que proporcionó a veces necesita hacer algo sincrónicamente. El tipo de retorno de su Function
debe ser un no Future
tipo. En este caso debes 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
En otras ocasiones, es posible que desee realizar un procesamiento asincrónico en este Function
. En ese caso deberías usar thenCompose
. El tipo de retorno de su Function
debería ser un CompletionStage
. El siguiente Function
en la cadena obtendrá el resultado de eso CompletionStage
como entrada, desenvolviendo así el 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 es una idea similar a la de Javascript Promise
. Promise.then
puede aceptar una función que devuelve un valor o Promise
un valor. La razón por la que estos dos métodos tienen nombres diferentes en Java se debe al borrado genérico . Function<? super T,? extends U> fn
y Function<? super T,? extends CompletionStage<U>> fn
se consideran del mismo tipo de tiempo de ejecución - Function
. Por lo tanto, thenApply
y thenCompose
debe tener un nombre distinto, o el compilador de Java se quejaría de firmas de métodos idénticas. El resultado final es que Javascript Promise.then
se implementa en dos partes, thenApply
y thenCompose
en Java.
Puede leer mi otra respuesta si también está confundido acerca de una función relacionada thenApplyAsync
.
map
yflatMap
enStream
?thenApply
es elmap
ythenCompose
es elflatMap
deCompletableFuture
. UsasthenCompose
para evitar tenerCompletableFuture<CompletableFuture<..>>
.