您能告诉我如何等待父CompletableFuture中的CompletableFuture列表,收集其结果并返回吗?
CompletableFuture<TerminateEnvironmentResponse> future = CompletableFuture.supplyAsync(() -> {
TerminateEnvironmentResponse terminateEnvironmentResponse = new TerminateEnvironmentResponse();
List<EnvironmentDto> environmentDtoList = ...
environmentDtoList.forEach(environmentDto -> {
_cloudFormationService.destroyStack(environmentDto)
.whenComplete((result, ex) -> {
if (ex != null) {
terminateEnvironmentResponse.setError(true);
} else {
int count = terminateEnvironmentResponse.getCount();
terminateEnvironmentResponse.setCount(++count);
}
});
});
return terminateEnvironmentResponse;
});
return future;
答案 0 :(得分:0)
到目前为止已决定...
static <V> CompletableFuture<Collection<V>> allOf(Collection<CompletableFuture<V>> futures) {
return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
.thenApply(v -> futures.stream()
.map(CompletableFuture::join)
.collect(toList()));
}
private CompletableFuture<DeleteStackResult> map(CompletableFuture<DeleteStackResponse> responseCompletableFuture) {
return responseCompletableFuture.thenApply(res -> new DeleteStackResult(res, null))
.exceptionally(ex -> new DeleteStackResult(null, ex));
}
@Data
@AllArgsConstructor
static class DeleteStackResult {
private DeleteStackResponse response;
private Throwable exception;
}
@Override public CompletableFuture<TerminateEnvironmentResponse> terminateEnvironment(UserDto userDto) {
List<CompletableFuture<DeleteStackResult>> completableFutureList = new ArrayList();
List<EnvironmentDto> environmentDtoList = _environmentService.getEnvironments();
environmentDtoList.forEach(environmentDto -> completableFutureList.add(map(_cloudFormationService.destroyStack(environmentDto))));
CompletableFuture<Collection<DeleteStackResult>> collectionCompletableFuture = allOf(completableFutureList);
CompletableFuture<TerminateEnvironmentResponse> future = collectionCompletableFuture.thenApply(resultCollection -> {
TerminateEnvironmentResponse terminateEnvironmentResponse = new TerminateEnvironmentResponse();
resultCollection.forEach(deleteStackResult -> {
int count = terminateEnvironmentResponse.getCount();
terminateEnvironmentResponse.setCount(++count);
if (deleteStackResult.getException() != null) {
terminateEnvironmentResponse.setError(true);
}
});
return terminateEnvironmentResponse;
});
return future; }