thenApply
およびのthenCompose
メソッドですCompletableFuture
。でCompleteableFuture
結果に何かをするつもりの場合に使用しますFunction
。
thenApply
そして、thenCompose
の両方が返されCompletableFuture
、自分の結果として。複数thenApply
またはthenCompose
一緒にチェーンできます。Function
各呼び出しにa を指定します。その結果は次への入力になりFunction
ます。
Function
あなたは時々供給は同期何かをする必要があります。の戻り型はFunction
非Future
型でなければなりません。この場合、を使用する必要がありますthenApply
。
CompletableFuture.completedFuture(1)
.thenApply((x)->x+1) // adding one to the result synchronously, returns int
.thenApply((y)->System.println(y)); // value of y is 1 + 1 = 2
場合によっては、これで非同期処理を実行することもできますFunction
。その場合はを使用する必要がありますthenCompose
。の戻り値の型はであるFunction
必要がありCompletionStage
ます。Function
チェーンの次は、その結果をCompletionStage
入力として取得し、をアンラップしCompletionStage
ます。
// addOneAsync may be implemented by using another thread, or calling a remote method
abstract CompletableFuture<Integer> addOneAsync(int input);
CompletableFuture.completedFuture(1)
.thenCompose((x)->addOneAsync(x)) // doing something asynchronous, returns CompletableFuture<Integer>
.thenApply((y)->System.println(y)); // y is an Integer, the result of CompletableFuture<Integer> above
これはJavascriptのアイデアに似ていPromise
ます。Promise.then
は、値または値のいずれかを返す関数を受け入れることができPromise
ます。Javaでこれら2つのメソッドの名前が異なる理由は、一般的な消去によるものです。です。Function<? super T,? extends U> fn
とFunction<? super T,? extends CompletionStage<U>> fn
同じランタイムタイプと見なされFunction
ます- 。したがってthenApply
、thenCompose
明確に名前を付ける必要があります。そうしないと、Javaコンパイラが同一のメソッドシグネチャについて文句を言うでしょう。最終結果ビーイングは、JavascriptののはPromise.then
二つの部分に実装されて- thenApply
とthenCompose
- Javaで。
あなたは読むことができます 関連する機能についても混乱している場合は、他の回答thenApplyAsync
。
map
とflatMap
ではStream
?thenApply
であるmap
とthenCompose
あるflatMap
のCompletableFuture
。thenCompose
を避けるために使用しCompletableFuture<CompletableFuture<..>>
ます。