Подтвердить что ты не робот

Завершение | 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?

4b9b3361

Ответ 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, вероятно, помогут понять это лучше:

thenApply

<U> CompletionStage<U> thenApply​(Function<? super T,? extends U> fn)

Возвращает новый CompletionStage, который, когда этот этап завершается как правило, выполняется с результатом этого этапа в качестве аргумента поставляемая функция.

Этот метод аналогичен Optional.map и Stream.map.

См. документацию CompletionStage для правил, охватывающих исключительное завершение.

thenCompose

<U> CompletionStage<U> thenCompose​(Function<? super T,? extends CompletionStage<U>> fn)

Возвращает новый CompletionStage, который завершается тем же значение как CompletionStage, возвращаемое данной функцией.

Когда этот этап завершается нормально, данная функция вызывается с помощью этот этап приводит в качестве аргумента, возвращая другой CompletionStage. Когда эта стадия завершается нормально, CompletionStage, возвращаемый этим методом, завершается тем же значение.

Для обеспечения прогресса поставленная функция должна завершение его результата.

Этот метод аналогичен Optional.flatMap и Stream.flatMap.

См. документацию CompletionStage для правил, охватывающих исключительное завершение.