Получить доступ

Чем thenCompose отличается от thenApply в CompletableFuture?

MiddleМногопоточность
Коротко

thenApply — как map: функция значение → значение. thenCompose — как flatMap: функция значение → новый CompletableFuture, результат «разворачивается». Без thenCompose получилось бы CompletableFuture<CompletableFuture<T>>.

  • thenCombine — объединить два независимых future
  • allOf и anyOf — группа
  • То же различие, что у Optional.map и flatMap, Stream.map и flatMap

А ещё Шаг асинхронный (запрос к сервису) — thenCompose

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

CompletableFuture<User> user = findUser(id);

// thenApply: синхронное преобразование
CompletableFuture<String> name = user.thenApply(User::name);

// thenApply с асинхронной функцией — вложенный тип
CompletableFuture<CompletableFuture<List<Order>>> bad = user.thenApply(u -> loadOrders(u));

// thenCompose: разворачивает
CompletableFuture<List<Order>> orders = user.thenCompose(u -> loadOrders(u));

Правило: если функция возвращает обычное значение — thenApply, если CompletionStage — thenCompose.

Для двух независимых запросов последовательная цепочка через thenCompose медленнее, чем запуск обоих сразу и thenCombine — время складывается, а не берётся максимум.

Что хотят услышать

  • Аналогия map и flatMap.
  • Пример с вложенным типом.
  • thenCombine для независимых операций.

Частые ошибки

  • Использовать thenApply там, где функция возвращает CompletableFuture (получится вложенность).
  • Путать thenCompose с thenCombine.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓thenApply трансформирует результат (как map); thenCompose сцепляет операцию, возвращающую свой CompletableFuture (как flatMap), избегая CompletableFuture<CompletableFuture<…>>
  • ✗Они идентичны, thenCompose — устаревший псевдоним
  • ✗thenApply асинхронный, thenCompose синхронный
  • ✗thenCompose объединяет два независимых future (zip)

Что спросят дальше

  • Когда брать allOf, а когда anyOf?
  • Чем thenCombine отличается от thenCompose?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем