![](/img/trans.png)
[英]Return a CompletableFuture containing a list of CompletableFutures
[英]Java List of CompletableFutures to CompletableFuture List with allOf()
我有一段包含更多方法的異步代碼,我需要讓它最后返回 CompletableFuture<List> 。
我需要使用兩種方法:
我想使用 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.