Завершение | thenApply vs thenCompose
Я не могу разглядеть разницу между thenApply(
) и thenCompose()
.
Итак, может ли кто-нибудь предоставить действительный прецедент?
Из документов Java:
thenApply(Function<? super T,? extends U> fn)
Возвращает новый CompletionStage
, который, когда этот этап завершается как правило, выполняется с результатом этого этапа в качестве аргумента поставляемая функция.
thenCompose(Function<? super T,? extends CompletionStage<U>> fn)
Возвращает новый CompletionStage
, который, когда этот этап завершается как правило, выполняется на этом этапе в качестве аргумента функция.
Получаю, что второй аргумент thenCompose
расширяет CompletionStage, где thenApply
нет.
Может ли кто-нибудь предоставить пример, в каком случае я должен использовать thenApply
и когда thenCompose
?
Ответы
Ответ 1
thenApply
используется, если у вас есть функция синхронного сопоставления.
CompletableFuture<Integer> future =
CompletableFuture.supplyAsync(() -> 1)
.thenApply(x -> x+1);
thenCompose
используется, если у вас есть функция асинхронного сопоставления (т.е. одна, которая возвращает CompletableFuture
). Затем он вернет будущее с результатом напрямую, а не вложенным будущим.
CompletableFuture<Integer> future =
CompletableFuture.supplyAsync(() -> 1)
.thenCompose(x -> CompletableFuture.supplyAsync(() -> x+1));
Ответ 2
Обновленные Javadocs в Java 9, вероятно, помогут понять это лучше:
<U> CompletionStage<U> thenApply(Function<? super T,? extends U> fn)
Возвращает новый CompletionStage
, который, когда этот этап завершается как правило, выполняется с результатом этого этапа в качестве аргумента поставляемая функция.
Этот метод аналогичен Optional.map
и Stream.map
.
См. документацию CompletionStage
для правил, охватывающих исключительное завершение.
<U> CompletionStage<U> thenCompose(Function<? super T,? extends CompletionStage<U>> fn)
Возвращает новый CompletionStage
, который завершается тем же значение как CompletionStage
, возвращаемое данной функцией.
Когда этот этап завершается нормально, данная функция вызывается с помощью этот этап приводит в качестве аргумента, возвращая другой CompletionStage
. Когда эта стадия завершается нормально, CompletionStage
, возвращаемый этим методом, завершается тем же значение.
Для обеспечения прогресса поставленная функция должна завершение его результата.
Этот метод аналогичен Optional.flatMap
и Stream.flatMap
.
См. документацию CompletionStage
для правил, охватывающих исключительное завершение.