web-dev-qa-db-ja.com

「CompletionStage」と「CompletableFuture」の違いは何ですか

私はそれらのそれぞれで例を見てきましたが、深さの違いが何であるかを正確に知る必要があります、時には両方を使用して同じ結果を得ることができると思うので、正しいを選択できるように知りたい1?

それぞれを使用する利点は何ですか?

この例のように両方とも機能します:

public CompletionStage<Result> getNextQueryUUID() {
    return CompletableFuture.supplyAsync(() -> {
        String nextId = dbRequestService.getNextRequestQueryUUID();
        return ok(nextId);
    }, executor);
}


public CompletableFuture<Result> getNextQueryUUID() {
    return CompletableFuture.supplyAsync(() -> {
        String nextId = dbRequestService.getNextRequestQueryUUID();
        return ok(nextId);
    }, executor);
}

この例は、Play frameworkで実行されます。

18

CompletionStage<T> は、このインターフェースの唯一の実装クラスである CompletabeFuture<T> であるインターフェースです。 Java CompletionStage<T>のドキュメント]を見ると、CompletionStageインターフェースが1つのCompletionStageを取得して別のCompletionStageに変換するメソッドを提供していることがわかります。 CompletionStagesによって実際にCompletabeFuture<T>オブジェクトとして返されるオブジェクト。

したがって、CompletabeFuture<T>を使用することはCompletionStage<T>を使用することと同じですが、将来可能になる新しいクラスの基本インターフェイスとして使用できるだけでなく、多くの降順型のターゲット型としても使用できますList<Integer> integerList = new ArrayList<>();ではなくArrayList<Integer> integerList = new ArrayList<>();を行う傾向があるため

詳細については、投稿を読むことができます CompletionStageとCompletableFutureの紹介 .

12
Aomine

CompletableFutureCompletionStageです。ただし、その名前が示すように、

  • 完了可能:completeまたはcompleteExceptionallyを使用して完了できます。
  • Futuregetメソッドなどを使用して結果を取得できます。

私見、あなたの例のように、ほとんどのAPIでは、CompletionStageを使用する必要があります。

  • 通常、実装はステージを完了するためのメカニズムを提供します。 completeなどのメソッドを呼び出し元に公開する必要はありません。
  • 呼び出し元は、getによって提供されるFutureのようなブロッキング呼び出しを使用する代わりに、非同期の方法で戻り値を使用することが期待されます。
10
Xiao

1つはインターフェイスで、もう1つはクラスです。通常、実装ではなくインターフェイスを返しますが、ここではそうではないと思います。 CompletableFutureを返すのは理にかなっています。

nless SpringのDelegatingCompletableFutureなど、そのインターフェイスの他の実装を使用していますが、例からはそうではありません。

1
Eugene