Разница между thenAccept и thenApply

Я читаю документ на CompletableFuture и описание для thenAccept() является

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

и для thenApply() является

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

Может ли кто-нибудь объяснить разницу между этими двумя примерами?

Ответ 1

Вам нужно посмотреть на полные подписи методов:

CompletableFuture<Void>     thenAccept(Consumer<? super T> action)
<U> CompletableFuture<U>    thenApply(Function<? super T,? extends U> fn)

thenAccept берет Consumer и возвращает T=Void CF, то есть тот, который не несет значения, только состояние завершения.

thenApply с другой стороны, выполняет Function и возвращает CF, несущий возвращаемое значение функции.

Ответ 3

Как ясно из 8472, они различаются по их выходному значению и аргументам и, следовательно, что вы можете им делать

CompletableFuture.completedFuture("FUTURE")
                .thenApply(r -> r.toLowerCase())
                .thenAccept(f -> System.out.println(f))
                .thenAccept(f -> System.out.println(f))
                .thenApply(f -> new String("FUTURE"))
                .thenAccept(f -> System.out.println(f));

future
null
FUTURE

функции Apply применяют другую функцию и передают будущее, имеющее значение

функции Accept потребляют это значение и возвращают будущие пустоты