首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将List<CompletableFuture<T>>转换为CompletableFuture<List<T>>

将List<CompletableFuture<T>>转换为CompletableFuture<List<T>>
EN

Stack Overflow用户
提问于 2019-01-25 17:46:19
回答 1查看 560关注 0票数 1

我有一个返回CompletableFuture<T>doTransmit方法。我想在一个循环中调用doTransmit,收集所有的CompletableFuture<T>并将其转换为一个CompletableFuture<List<T>>,当所有收集的List<T>都已被解析时,它将使用CompletableFuture<T>进行解析。

代码语言:javascript
复制
CompletableFuture<DeliveryResponse> doTransmit(Notification notification, Receiver receiver, ContentMutator contentMutator) {
   //send notification to this receiver
}

CompletableFuture<List<DeliveryResponse>> doTransmit(Notification notification, List<Receiver> receivers, ContentMutator contentMutator) {
        List<CompletableFuture<DeliveryResponse>> completableFutures = new ArrayList<>();
        receivers.forEach(receiver -> completableFutures.add(doTransmit(notification.clone(), receiver, contentMutator)));
        CompletableFuture<List<DeliveryResponse>> listCompletableFuture = CompletableFuture.supplyAsync(ArrayList::new);
        completableFutures.forEach(
                completableFuture ->
                        completableFuture.thenCombine(listCompletableFuture,
                            ((deliveryResponse, deliveryResponses) -> deliveryResponses.add(deliveryResponse))
                        )
        );
        return listCompletableFuture;
}

但是当我调用第二个doTransmit(notification, receivers, null).thenAccept(list -> System.out.println(list.size()));时,收到的列表是空的。

我是CompletableFuture概念的新手。然而,我知道Javascript承诺。请帮帮忙。

EN

回答 1

Stack Overflow用户

发布于 2019-01-25 17:56:19

您需要的是一个收集响应的Supplier<List<DeliveryResponse>>

代码语言:javascript
复制
// your code
List<CompletableFuture<DeliveryResponse>> completableFutures = new ArrayList<>();
receivers.forEach(receiver -> completableFutures.add(doTransmit(notification.clone(), receiver, contentMutator)));

Supplier<List<DeliveryResponse>> responseCollector = () -> {
    List<DeliveryResponse> result = new ArrayList<>();
    // get the result for each... I think you need to try-catch this
    receivers.forEach(r -> result.add(r.get());
    return result;
}

然后从中创建一个CompletableFuture

代码语言:javascript
复制
CompletableFuture<List<DeliveryResponse>> listFuture = CompletableFuture.supplyAsync(responseCollector);
return listFuture;

现在,listFuture通过调用每个期货的get来收集结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54362631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档