Заменить 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;
}));