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