3つのCompletableFuturesがすべて3つの異なるデータ型を返します。Java 8完了可能先物すべて異なるデータ型
3つのすべての先物から返された結果のコンポジションである結果オブジェクトを作成したいと考えています。
だから私の現在の作業のコードは次のようになります。
public ClassD getResultClassD() {
ClassD resultClass = new ClassD();
CompletableFuture<ClassA> classAFuture = CompletableFuture.supplyAsync(() -> service.getClassA());
CompletableFuture<ClassB> classBFuture = CompletableFuture.supplyAsync(() -> service.getClassB());
CompletableFuture<ClassC> classCFuture = CompletableFuture.supplyAsync(() -> service.getClassC());
CompletableFuture.allOf(classAFuture, classBFuture, classCFuture)
.thenAcceptAsync(it -> {
ClassA classA = classAFuture.join();
if (classA != null) {
resultClass.setClassA(classA);
}
ClassB classB = classBFuture.join();
if (classB != null) {
resultClass.setClassB(classB);
}
ClassC classC = classCFuture.join();
if (classC != null) {
resultClass.setClassC(classC);
}
});
return resultClass;
}
私の質問は以下のとおりです。ここ
私の仮定は、私が
allOf
とthenAcceptAsync
を使用していますので、このコールは非ブロッキングになるということです。私の理解は正しいのですか?これは、異なる結果タイプを返す複数の先物を処理する正しい方法ですか?
ClassD
オブジェクトをthenAcceptAsync
に作成するのは正しいですか?- thenAcceptAsyncラムダで
join
またはgetNow
メソッドを使用するのが適切ですか?
詳細な返信をいただきありがとうございます。私の唯一の答えは、thenAppAppAsyncがCompletableFutureの戻り値のタイプを持っていて、これがここでどう機能し、どのようにこのメソッドを呼び出して結果を消費するのでしょうか? –
いいえ、 'completetableFuture'そのため、 'thenApplyAsync'関数を渡した関数が' Void'を入力として受け取ります(上記の 'dummy'パラメータの代わりに' dummy-> 'の代わりに'(Void dummy) - > 'を書くこともできます)。次に、関数は 'Void'入力を(実際には無視して)' ClassD'の結果に変換するので、 'thenApplyAsync'の結果は' CompletableFuture 'になります。 –
Holger
@Holger私はあなたと同様のルートを辿っていましたが、サービスコールでOptional.ofNullableを使用していましたので、 'cCFuture.join()。ifPresent(class :: SetStuff)'を使用できます。 – Ash