在Java中如何使未来依赖于另外两个

在Java中如何使未来依赖于另外两个,java,completable-future,Java,Completable Future,我有一个未来,理想情况下,它将采用来自另外两个未来的两个参数。对于这个,我有。thenCombine(),这里的技巧是第二个未来需要第一个未来的结果 比如说: 我有期货A、B和C 未来B需要未来A的结果 未来C需要未来A和B的结果 我想要一些类似于: CompletableFuture<Customer> customerFuture = CompletableFuture.supplyAsync(() -> findCustomer(123)); CompletableF

我有一个未来,理想情况下,它将采用来自另外两个未来的两个参数。对于这个,我有。thenCombine(),这里的技巧是第二个未来需要第一个未来的结果

比如说:

  • 我有期货A、B和C
  • 未来B需要未来A的结果
  • 未来C需要未来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));
CompletableFuture-customerFuture=CompletableFuture.supplyAsync(()->findCustomer(123));
CompletableFuture-shopFuture=CompletableFuture.supplyAsync((客户)->getAllAccessibleShops(客户));
CompletableFuture routeFuture=customerFuture。然后合并(shopFuture,(客户,店铺)->FindRoote(客户,店铺));
当然,combine()不是我想要的,上面的代码看起来很愚蠢,因为我以后不需要客户,但这只是一个示例


有没有办法做到这一点?

您的解决方案是正确的,唯一的问题是
shopFuture
的声明。您应该使用
然后应用[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));

另请参阅这两个步骤在行为上的差异。

如果必须按顺序执行这些步骤,为什么它们是在不同的未来?@jimmycarr您能详细说明一下吗?我真的很感兴趣未来的重点是在后台做一些处理,然后让你以后得到结果。如果未来的B和C依赖于他们之前的其他期货,那么将其全部放在一个期货中就像将其放在三个相互依赖的独立期货中一样快。好吧,我理解,这是有道理的。所以我想我会改变我做这件事的方式。现在出于好奇,有什么东西可以让它工作吗?我的意思是有这种顺序依赖性?是的,你可以让它按照你最初的想法工作。如果您调用每个future,您可以等待它完成处理并获得结果,然后将结果传递给下一个future的构造函数。
CompletableFuture<Route> customerFuture = CompletableFuture.supplyAsync(() -> {
   Customer customer = findCustomer(123));
   Shop shop = getAllAccessibleShops(customer));
   return findRoute(customer, shop)
});