我有一个返回CompletableFuture<T>的doTransmit方法。我想在一个循环中调用doTransmit,收集所有的CompletableFuture<T>并将其转换为一个CompletableFuture<List<T>>,当所有收集的List<T>都已被解析时,它将使用CompletableFuture<T>进行解析。
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承诺。请帮帮忙。
发布于 2019-01-25 17:56:19
您需要的是一个收集响应的Supplier<List<DeliveryResponse>>:
// 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:
CompletableFuture<List<DeliveryResponse>> listFuture = CompletableFuture.supplyAsync(responseCollector);
return listFuture;现在,listFuture通过调用每个期货的get来收集结果。
https://stackoverflow.com/questions/54362631
复制相似问题