thenApply vs thenCompose в CompletableFuture — почему путают через раз

Вопрос проверяет умение строить цепочки асинхронных вызовов без блокирующего get() и понимание разницы между map и flatMap применительно к Future.

thenApply берёт синхронную функцию T -> R и сам оборачивает результат в новый CompletableFuture. Если переданная функция сама возвращает CompletableFuture, получится вложенность: CompletableFuture>. Такую цепочку дальше не продолжить без ручной распаковки.

thenCompose ожидает функцию T -> CompletableFuture и разворачивает результат сам, без вложенности. Это тот же принцип, что flatMap у Stream или Optional.

CompletableFuture future = fetchUserId(email) .thenCompose(id -> fetchUserById(id));

Что спросят следом: как обработать ошибку в середине цепочки без потери результата предыдущего шага — про exceptionally() и handle(), и чем они отличаются друг от друга по доступу к успешному результату.

thenApply — для трансформации значения, thenCompose — для склеивания асинхронных шагов друг с другом.

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

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


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