Выбор ответа Middle java.util.concurrent и виртуальные потоки обновлено

thenApply и thenCompose

Вопрос

Метод loadUser(id) возвращает CompletableFuture<User>. Что получится в future.thenApply(this::loadUser), где future типа CompletableFuture<Long>?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: CompletableFuture<CompletableFuture<User, нужен thenCompose. thenApply оборачивает результат функции, а функция сама возвращает future, получается вложенность. thenCompose это flatMap: он «распаковывает» внутренний future.

Варианты ответа

  1. CompletableFuture<User>: вложенный future распакуется сам
  2. CompletableFuture<CompletableFuture<User>>, нужен thenComposeправильный ответ
  3. Ошибка компиляции: loadUser не подходит для thenApply
  4. User, потому что thenApply дожидается результата функции

Разбор

thenApply оборачивает результат функции, а функция сама возвращает future, получается вложенность. thenCompose это flatMap: он «распаковывает» внутренний future. Код компилируется, просто тип неудобный. thenApply ничего не ждёт синхронно, он строит цепочку.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме