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 — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки