Вопрос с собеседования · Java

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

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

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

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

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

Подробно

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.

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

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

Показать варианты и ответ
  • ✗Они идентичны, thenCompose — устаревший псевдоним thenApply
  • ✗thenApply выполняется асинхронно, а thenCompose — синхронно
  • ✗thenCompose объединяет два независимых future в пару результатов, как zip
  • ✓thenApply работает как map, thenCompose — как flatMap

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования