列出CompletableFuture

时间:2019-04-17 10:54:53

标签: java completable-future

您能告诉我如何等待父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;

1 个答案:

答案 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;   }
相关问题