thenApplyy thenComposeson métodos de CompletableFuture. Úselos cuando tenga la intención de hacer algo con CompleteableFutureel resultado de to con a Function.
thenApplyy thenComposeambos devuelven un CompletableFuturecomo resultado. Puede encadenar varios thenApplyo thenComposejuntos. Suministre a Functiona cada llamada, cuyo resultado será la entrada a la siguiente Function.
El Functionque proporcionó a veces necesita hacer algo sincrónicamente. El tipo de retorno de su Functiondebe ser un no Futuretipo. 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 Functiondebería ser un CompletionStage. El siguiente Functionen la cadena obtendrá el resultado de eso CompletionStagecomo 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.thenpuede aceptar una función que devuelve un valor o Promiseun 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> fny Function<? super T,? extends CompletionStage<U>> fnse consideran del mismo tipo de tiempo de ejecución - Function. Por lo tanto, thenApplyy thenComposedebe 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.thense implementa en dos partes, thenApplyy thenComposeen Java.
Puede leer mi otra respuesta si también está confundido acerca de una función relacionada thenApplyAsync.
mapyflatMapenStream?thenApplyes elmapythenComposees elflatMapdeCompletableFuture. UsasthenComposepara evitar tenerCompletableFuture<CompletableFuture<..>>.