gpt4 book ai didi

java - 如何在 Java 中使 future 依赖于另外两个

转载 作者:行者123 更新时间:2023-11-30 02:43:42 25 4
gpt4 key购买 nike

我有一个 future ,理想情况下会采用来自其他两个 future 的两个参数。为此,我有 .thenCombine(),这里的技巧是第二个 future 需要第一个 future 的结果。

比方说:

  • 我有 future A、B 和 C
  • future B 需要 future A 的结果
  • future C需要 future A和B的结果

我想要这样的东西:

CompletableFuture<Customer> customerFuture = CompletableFuture.supplyAsync(() -> findCustomer(123));
CompletableFuture<Shop> shopFuture = CompletableFuture.supplyAsync((customer) ->getAllAccessibleShops(customer));
CompletableFuture<Route> routeFuture = customerFuture.thenCombine(shopFuture, (cust, shop) -> findRoute(cust, shop));

当然 thenCombine() 不是我正在寻找的东西,上面的代码看起来很愚蠢,因为之后我不应该需要客户,但这只是一个例子。

有办法实现吗?

最佳答案

您的解决方案是正确的,唯一的问题在于shopFuture的声明中。您应该使用thenApply[Async]()这样它就可以访问第一个的结果:

CompletableFuture<Customer> customerFuture = CompletableFuture.supplyAsync(() -> findCustomer(123));
CompletableFuture<Shop> shopFuture = customerFuture.thenApply((customer) -> getAllAccessibleShops(customer));
CompletableFuture<Route> routeFuture = customerFuture.thenCombine(shopFuture, (cust, shop) -> findRoute(cust, shop));

请注意,自 shopFuture 起执行顺序保持连续。需要 customerFuture 的结果,和routeFuture需要 shopFuture 的结果。但是,如果您还有其他工作需要处理 CustomerShop ,您可以使用额外的 thenApply[Async]调用来运行它们。

如果您与这些结果无关,您可能希望将所有 3 个调用分组为一个 supplyAsync() :

CompletableFuture<Route> customerFuture = CompletableFuture.supplyAsync(() -> {
Customer customer = findCustomer(123));
Shop shop = getAllAccessibleShops(customer));
return findRoute(customer, shop)
});

另请参阅CompletableFuture, supplyAsync() and thenApply()两者之间的行为差​​异。

关于java - 如何在 Java 中使 future 依赖于另外两个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40863019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com