使用 Java 将三个可完成的未来合并为一个

问题描述 投票:0回答:1

以下 3 个方法返回

CompleteableFuture<JsonObject>
,我需要的内容在 JsonObject 的 value 属性上,所以最终我需要做一些类似 response.getJsonArray("value") 的事情

CompletableFuture<JsonObject> completeableFuture1 = entityService.getProducts();
CompletableFuture<JsonObject> completeableFuture2 = entityService.getCustomers();
CompletableFuture<JsonObject> completeableFuture3 = entityService.getOrders();

一旦我成功检索到这 3 个部分,我想继续使用依赖于它们的其余代码。我需要访问所有 3 个列表:产品、客户、订单。

在做了一些研究后,我认为我需要使用 allOf(),但是无法找出正确的语法来将它们拼凑在一起。

java asynchronous future completable-future
1个回答
2
投票

要将多个

CompletableFuture
实例合并为一个,可以使用
CompletableFuture.allOf()
方法。此方法采用
CompletableFuture
实例的可变参数,并返回一个新的
CompletableFuture
,它在所有输入期货完成时完成,而不返回任何结果。

要访问输入期货的结果,您可以使用

CompletableFuture.join()
方法,该方法在未来完成时返回结果,或者如果未来异常完成则抛出异常。

这是一个示例,说明如何使用

CompletableFuture.allOf()
合并三个
CompletableFuture<JsonObject>
实例并提取
JsonArray
值:

CompletableFuture<JsonObject> productsFuture = entityService.getProducts();
CompletableFuture<JsonObject> customersFuture = entityService.getCustomers();
CompletableFuture<JsonObject> ordersFuture = entityService.getOrders();

CompletableFuture<Void> allFutures = CompletableFuture.allOf(productsFuture, customersFuture, ordersFuture);

CompletableFuture<List<JsonArray>> mergedFutures = allFutures.thenApply(
  v -> Arrays.asList(
    productsFuture.join().getJsonArray("value"),
    customersFuture.join().getJsonArray("value"),
    ordersFuture.join().getJsonArray("value")
  )
);

// Continue with the remainder of your code that depends on the merged results
mergedFutures.thenAccept(results -> {
  JsonArray products = results.get(0);
  JsonArray customers = results.get(1);
  JsonArray orders = results.get(2);

  // Do something with the merged results
});

在这个例子中,我们首先从

CompletableFuture<JsonObject>
对象中获取三个
entityService
实例,我假设它是某种服务或 API 的实例,它返回 JSON 数据作为
CompletableFuture
实例。

然后我们使用

CompletableFuture.allOf()
将三个输入期货合并到一个新的
CompletableFuture<Void>
实例中,称为
allFutures
,当所有输入期货完成时完成。

接下来,我们使用

thenApply()
allFutures
方法创建一个名为
CompletableFuture<List<JsonArray>>
的新
mergedFutures
实例。使用
JsonArray
方法从输入期货中提取的
join()
值列表完成了这个未来。

最后,我们使用

thenAccept()
mergedFutures
方法在合并结果可用时对它们执行一些操作。在这种情况下,我们从
JsonArray
中提取
List
值并将它们分配给局部变量,然后可以在代码的其余部分中使用。

© www.soinside.com 2019 - 2024. All rights reserved.