Как я написал в своем комментарии, это невозможно.
Рассмотрим какой-нибудь произвольный сервис, который будет возвращать CompletableFuture<Integer>
:
CompletableFuture<Integer> getDiceRoll();
Теперь я могу преобразовать это CompletableFuture<Integer>
к Stream<CompletableFuture<List<Object>>>
без проблем:
Stream<CompletableFuture<List<Object>>> futureList = Stream.of(getDiceRoll().thenApply(n -> List.of(new Object[n])));
Предположим, что существует общий способ превратить Stream<CompletableFuture<List<T>>>
в Stream<CompletableFuture<T>>
:
<T> Stream<CompletableFuture<T> magic(Stream<CompletableFuture<List<T>>> arg);
Тогда ямогу сделать следующее:
int diceRoll = magic(Stream.of(getDiceRoll().thenApply(n -> List.of(new Object[n])))).count();
Подождите, что?
Теперь я могу получить произвольное целое число из CompletableFuture
. Это означает, что с некоторыми инженерными усилиями я могу получить всю информацию из CompletableFuture - в конце концов, память - это просто некоторые числа.
Таким образом, мы должны сделать вывод, что такой метод, как magic
, не может существовать безнарушая ткань времени.
И вот ответ: такого метода не существует, потому что он не может существовать.