当前位置: 首页 > 知识库问答 >
问题:

将List转换为CompletableFuture[重复]

宗政颖逸
2023-03-14

我有一个方法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个答案

田彬郁
2023-03-14

您想要的是供应商

// 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 来收集结果。

 类似资料:
  • 问题内容: Java 8引入了可组合的Future的新实现(包括一堆thenXxx方法)。我想专门使用它,但是我想使用的许多库仅返回非可组合实例。 有没有一种方法可以将返回的实例包装在内,以便我可以编写它? 问题答案: 有一种方法,但是您不喜欢它。以下方法将a 转换为a : 显然,这种方法的问题在于,对于每个 Future ,都会阻塞线程以等待 Future 的结果-与 Future 的想法相矛盾

  • 在我的项目中,我有一个Akka层,它返回一个,接收Future的部分是Java风格。 团队中的人不了解Scala,他们宁愿使用,因为他们更了解Java 8 API。 有没有什么好方法可以将一个转换成一个?。 显然是以非阻塞的方式。 当做

  • 我想将下面方法的返回类型更改为< code>Future[Unit] 我使用的是Scala 2.12.1。是否有任何方便的方法可以将Java 8<code>CompletableFuture

  • 我在MongoDB中使用Java驱动程序3.0,以便通过Web服务发送JSON。 当我想将文档对象(org.bson.文档)转换为JSON时,我使用,当我想将JSON转换为文档对象时,我使用。 但是,当我处理文档列表时(如JSON中所示:

  • 此API调用返回一个可能较大的列表 排序、搜索和访问一个潜在的大型LinkedList将非常缓慢,对我的程序来说是不可接受的。因此,我需要将列表转换为ArrayList,以确保程序的实际效率。但是,由于列表很可能已经是ArrayList,因此不必要地创建列表的新ArrayList副本将效率低下。 考虑到这些约束,我提出了以下方法将列表转换为ArrayList: 我的问题是:这是处理具有未知实现的列

  • 如何将一个var转换为两个var列表? 下面是我的输入变量: 我希望我的结果应该是: