thenApply vs thenCompose: где путают эти методы CompletableFuture

Вопрос проверяет, понимаете ли вы разницу между обычным map и flatMap в мире асинхронных вычислений — CompletableFuture ведёт себя как контейнер, и у него та же пара операций.

thenApply(Function) берёт готовое значение T и синхронно превращает его в U. Результат — CompletableFuture, без сюрпризов с типами.

thenCompose(Function>) нужен, когда функция сама возвращает future — например, результат одного асинхронного вызова определяет следующий. Он разворачивает вложенность, а не оборачивает её ещё раз.

CompletableFuture> nested = userFuture.thenApply(user -> orderService.findByUser(user));

CompletableFuture flat = userFuture.thenCompose(user -> orderService.findByUser(user));

Что спросят следом: чем thenApplyAsync отличается от thenApply по executor'у, и что происходит с exceptionally при цепочке через thenCompose — исключение из внутреннего future долетает наружу так же, как из обычного.

Путают эти методы, потому что оба «трансформируют значение». Разница в том, что возвращает переданная функция — значение или уже future.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки