2016-11-29 3 views
1

私は、2つの他の先物から2つのパラメータを取るのが理想的です。これについて私は.comCombine()を持っています。ここでのトリックは、2番目の未来が最初のものの結果を必要とすることです。未来をJavaの他の2つに依存する方法

さんが言ってみましょう:私は先物を持って

  • をA、BおよびC
  • 将来Bが
  • 今後の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)); 

もちろん、thenCombine()は私が探しているものではありません。後で顧客が必要ないはずだから上のコードは馬鹿に見えますが、これはほんの一例です。

これを達成する方法はありますか?

+0

手順を順番に実行する必要がある場合は、それらが別々の先物である理由は何ですか? –

+0

@jimmycarrあなたはこれを詳しく説明できますか?私は本当に興味があります –

+0

未来のポイントは、バックグラウンドでいくつかの処理を行い、後で結果を得ることです。将来のBとCがそれ以前の他の先物に依存しているならば、それをすべて将来のものにすることは、お互いに依存する3つの別々の先物に入れることと同じくらい早いです。 –

答えて

2

解決策は正しいです。唯一の問題は、shopFutureの宣言にあります。それは最初の1の結果にアクセスできるように、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)); 

を注意shopFuturecustomerFutureの結果を必要とし、routeFutureshopFutureの結果を必要とするため、実行順序がシーケンシャルままであること。しかし、CustomerまたはShopを追加作業する場合は、追加のthenApply[Async]コールを使用して実行することができます。

あなたはそれらの結果を行うには何も持っていない場合は、グループに単一supplyAsync()にすべての3呼び出したい場合があります:

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

を2間の挙動の違いのためにもCompletableFuture, supplyAsync() and thenApply()参照してください。

関連する問題