簡體   English   中英

Java List of CompletableFutures to CompletableFuture List with allOf()

[英]Java List of CompletableFutures to CompletableFuture List with allOf()

我有一段包含更多方法的異步代碼,我需要讓它最后返回 CompletableFuture<List> 。

我需要使用兩種方法:

  1. 第一個方法 getConfigsByType() 返回一個 Config 類型的 Flux
  2. 第二個需要應用於每個單獨的 Config 對象,它返回 Config 類型的 CompletableFuture。

我想使用 allOf() 來獲得預期的結果,但我有一個錯誤,我不知道為什么:“不存在 U 類型變量的實例,因此布爾值符合 CompletionStage”。 錯誤在這一行: .thenCompose(segmentedConfig -> finalEvents.add(segmentedConfig));

private CompletableFuture<List<Config>> getConfigs(User user) {

Queue<Config> finalEvents = new ConcurrentLinkedQueue<>();
List<CompletableFuture<Config>> completableFutureList =  admin.getConfigsByType(configurationProperties.getEvents()) // returns Flux<Config>
                .map(config -> {
                    return segmentConfig(config, user) // returns CompletableFuture<Config>
                            .thenCompose(segmentedConfig -> finalEvents.add(segmentedConfig));
                })
                .collect(Collectors.toList()); 

return allOf(completableFutureList)
                .thenApply(list -> finalEvents);

private CompletableFuture<Void> allOf(List<CompletableFuture<Config>> futuresList) {
        return CompletableFuture.allOf(futuresList.toArray(new CompletableFuture[0]));
    }

    private CompletableFuture<Config> segmentConfig(Config config, User user) {
        return configurationApi.getSegmentedConfig(new DefaultCombinedConfigProvider<>(config), user);
    }

我究竟做錯了什么?

allOf(completableFutureList)創建的未來完成之前,您無法生成結果列表。 此外, Queue<Config>不會變成List<Config>

因此,請從生成List<CompletableFuture<Config>>的流操作中刪除生成結果列表的嘗試。 然后,將產生結果列表的實際操作添加到allOf(completableFutureList)

private CompletableFuture<List<Config>> getConfigs(User user) {
  List<CompletableFuture<Config>> completableFutureList
      = admin.getConfigsByType(configurationProperties.getEvents())
          .map(config -> segmentConfig(config, user))
          .collect(Collectors.toList());

  return CompletableFuture.allOf(completableFutureList.toArray(new CompletableFuture[0]))
      .thenApply(voidArg -> completableFutureList.stream()
          .map(CompletableFuture::join)
          .collect(Collectors.toList()));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM