Заменить Futures.successfulAsList на Java 8 CompletableFuture?

Я ищу канонический код для замены гуавы Futures.successfulAsList() с Java 8 CompletableFuture код.

Я думаю CompletableFuture.allOf() кажется заменой Futures.allAsList(), но я не вижу ничего похожего successfulAsList(),

1 ответ

Решение

CompletableFuture.allOf(…) на самом деле ближе к successfulAsList() чем allAsList(),

В самом деле, allOf() завершается только после завершения всех данных фьючерсов, будь то со значением или исключением. Затем вы можете проверить каждое будущее, чтобы проверить, как оно завершилось (например, в следующем thenAccept()/thenApply()).

allAsList() не имеет близкого эквивалента в CompletableFuture потому что он должен потерпеть неудачу, как только произойдет сбой любого из входных фьючерсов. Тем не менее, вы можете реализовать это с помощью комбинации allOf() и связывая каждое входное будущее с exceptionally() это сделало бы будущее возвращенным allOf() сразу не получится

CompletableFuture<String> a = …, b = …, c = …;
CompletableFuture<Void> allWithFailFast = CompletableFuture.allOf(a, b, c);
Stream.of(a, b, c)
    .forEach(f -> f.exceptionally(e -> {
        allWithFailFast.completeExceptionally(e);
        return null;
    }));
Другие вопросы по тегам