Java 转换列表<;完全未来<;T>&燃气轮机;完成未来<;列表<;T>&燃气轮机;

Java 转换列表<;完全未来<;T>&燃气轮机;完成未来<;列表<;T>&燃气轮机;,java,asynchronous,java-8,completable-future,Java,Asynchronous,Java 8,Completable Future,我有一个方法doTransmit,它返回一个CompletableFuture。我想在一个循环中调用doTransmit,收集所有CompletableFuture,并将其转换为CompletableFuture,当所有收集的CompletableFuture都已解析后,该CompletableFuture将与列表一起解析 CompletableFuture<DeliveryResponse> doTransmit(Notification notification, Receive

我有一个方法
doTransmit
,它返回一个
CompletableFuture
。我想在一个循环中调用
doTransmit
,收集所有
CompletableFuture
,并将其转换为
CompletableFuture
,当所有收集的
CompletableFuture
都已解析后,该
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;
}
CompletableFuture DotTransmit(通知通知、接收者接收者、ContentMutator ContentMutator){
//向此接收者发送通知
}
CompletableFuture DotTransmit(通知通知、列表接收者、ContentMutator ContentMutator){
List completableFutures=新建ArrayList();
receivers.forEach(receiver->completableFutures.add(doTransmit(notification.clone(),receiver,contentMutator));
CompletableFuture列表CompletableFuture=CompletableFuture.SupplySync(ArrayList::new);
完全期货(
可完成的未来->
completableFuture。然后合并(列出completableFuture,
((deliveryResponse,deliveryResponses)->deliveryResponses.add(deliveryResponse))
)
);
回归未来;
}
但是当我调用第二个
doTransmit(通知,接收者,null)时,然后调用accept(list->System.out.println(list.size())收到的列表为空


我不熟悉
完全未来的概念。然而,我知道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;
}

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

因此您需要一个
CompletableFuture
包含另一个
CompletableFuture
s的
List
结果的
列表。我不知道你为什么想要
完整的未来
。。。
T
s将已计算。从
列表中,我可以检查有多少通知已发送或失败。在
receivers.forEach(r->result.add(r.get());
r
不是
CompletableFuture
的实例。
CompletableFuture<List<DeliveryResponse>> listFuture = CompletableFuture.supplyAsync(responseCollector);
return listFuture;