thenApplyи thenComposeявляются методами CompletableFuture. Используйте их, когда намереваетесь сделать что-то, чтобы добиться CompleteableFutureрезультата с помощью Function.
thenApplyи thenComposeоба возвращают CompletableFutureкак свой собственный результат. Вы можете объединить несколько thenApplyили thenComposeвместе. Поставьте a Functionдля каждого вызова, результат которого будет вводом для следующего Function.
Предоставленному Functionвами иногда необходимо что-то делать синхронно. Тип возврата вашего Functionдолжен быть не Futureтипом. В этом случае вам следует использовать 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
В других случаях вы можете захотеть выполнить здесь асинхронную обработку Function. В этом случае вам следует использовать thenCompose. Тип возврата вашего Functionдолжен быть CompletionStage. Следующий Functionв цепочке получит результат CompletionStageкак входной, таким образом разворачивая файл 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
Это похоже на идею Javascript Promise. Promise.thenможет принимать функцию, которая либо возвращает значение, либо Promiseзначение. Причина, по которой эти два метода имеют разные имена в Java, связана с общим стиранием . Function<? super T,? extends U> fnи Function<? super T,? extends CompletionStage<U>> fnсчитаются одним и тем же типом среды выполнения - Function. Таким образом, thenApplyи thenComposeон должен быть четко назван, иначе компилятор Java будет жаловаться на идентичные сигнатуры методов. Конечным результатом является то, что Javascript Promise.thenреализован в двух частях - thenApplyи thenCompose- в Java.
Вы можете прочитать мой другой ответ, если вас не смущает связанная функция thenApplyAsync.
mapиflatMapвStream?thenApplyэтоmapиthenComposeестьflatMapизCompletableFuture. Вы используете,thenComposeчтобы избежатьCompletableFuture<CompletableFuture<..>>.