преобразовать Map <String, CompletableFuture <Response>> в CompletableFuture <Map <String, Response >> - PullRequest
0 голосов
/ 18 июня 2019

У меня есть: Map<String, CompletableFuture<Response>>
Я ожидаю: CompletableFuture<Map<String, Response>>

Я хочу, чтобы результат завершился после завершения каждого "внутреннего" будущего, а затем получил карту, которая отобразит строки нарезультаты завершены.Я ищу элегантный способ добиться этого и пробовал с потоками, но пока что не получилось.

Я видел метод, который выполняет аналогичную работу, но со списками здесь: https://github.com/spotify/completable-futures/blob/master/src/main/java/com/spotify/futures/CompletableFutures.java#L49

1 Ответ

0 голосов
/ 19 июня 2019

Невозможно вызвать join для каждого CompletableFuture, но вы можете использовать CompletableFuture.allOf, чтобы запланировать выполнение этого действия, когда все фьючерсы будут завершены, поэтому никакой вызов join не заблокирует поток. Затем используйте Stream API для выполнения массовой операции:

Map<String, CompletableFuture<Response>> map = …

CompletableFuture<Map<String, Response>> f =
    CompletableFuture.allOf(map.values().toArray(new CompletableFuture[0]))
        .thenApply(_void -> map.entrySet().stream()
            .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().join())));
...