Что проверяет вопрос про CompletableFuture.allOf()

allOf() возвращает CompletableFuture, а не список результатов. Вопрос проверяет, понимаете ли вы, что allOf синхронизирует момент завершения задач, но не агрегирует их значения — результаты нужно собирать отдельно.

Частая ошибка — ждать, что thenApply на allOf сразу отдаст готовый список значений. На деле внутри нужно пройти по исходным future и вызвать join() на каждом: к моменту завершения allOf все они уже выполнены, join() не заблокирует поток.

Если один из future упал с исключением, allOf завершится exceptionally — но остальные задачи продолжат выполняться независимо. join() на упавшем future бросит CompletionException, и без отдельной обработки результаты остальных потеряются вместе с ним.

List> futures = fetchAllAsync();

CompletableFuture all = CompletableFuture.allOf( futures.toArray(new CompletableFuture[0]) );

List results = all.thenApply(v -> futures.stream() .map(CompletableFuture::join) .collect(Collectors.toList()) ).join();

Что спросят следом: как получить результаты остальных задач, если одна из них упала. Ответ — обрабатывать каждый future через exceptionally() или handle() до объединения в allOf, чтобы сбой одной задачи не сносил весь batch.

allOf — про момент завершения, а не про сбор данных.

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

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


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