提问者:小点点

将List<CompletableFuture<T>>转换为CompletableFuture<List<T>>[重复]


我有一个方法doTransmit,它返回CompletableFuture

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;
}

但是当我调用第二个< code>doTransmit(notification,receivers,null)时。然后接受(列表-

我是CompletableFuture概念的新手。但是,我知道Javascript Promises。请帮忙。


共1个答案

匿名用户

您想要的是供应商

// 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;
}

然后根据以下内容创建一个< code>CompletableFuture:

CompletableFuture<List<DeliveryResponse>> listFuture = CompletableFuture.supplyAsync(responseCollector);
return listFuture;

现在,列表未来通过为每个期货调用 get 来收集结果。