gpt4 book ai didi

java - 将 List> 转换为 CompletableFuture>

转载 作者:行者123 更新时间:2023-11-30 05:48:43 26 4
gpt4 key购买 nike

我有一个方法doTransmit它返回 CompletableFuture<T> 。我要调用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 Promise。请帮忙。

最佳答案

你想要的是 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收集结果对于每个 future 。

关于java - 将 List<CompletableFuture<T>> 转换为 CompletableFuture<List<T>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54362631/

26 4 0