CompletableFuture
のドキュメントを読んでいます。thenAccept()
の説明は
このステージが正常に完了すると、指定されたアクションの引数としてこのステージの結果で実行される新しいCompletionStageを返します。
thenApply()
の場合
このステージが正常に完了すると、このステージの結果が提供された関数の引数として実行される新しいCompletionStageを返します。
誰でも簡単な例を使ってこの2つの違いを説明できますか?
完全なメソッドシグネチャを確認する必要があります。
CompletableFuture<Void> thenAccept(Consumer<? super T> action)
<U> CompletableFuture<U> thenApply(Function<? super T,? extends U> fn)
thenAccept
はConsumer
を取り、T=Void
CF、つまり値を保持せず、完了状態のみを保持するCFを返します。
一方、thenApply
はFunction
を取り、関数の戻り値を保持するCFを返します。
thenApply
は現在のステージの結果を返しますが、thenAccept
は返しません。
この記事を読む: http://codeflex.co/Java-multithreading-completablefuture-explained/
the8472で明確に説明されているように、それらは出力値と引数によって区別されます。
CompletableFuture.completedFuture("FUTURE")
.thenApply(r -> r.toLowerCase())
.thenAccept(f -> System.out.println(f))
.thenAccept(f -> System.out.println(f))
.thenApply(f -> new String("FUTURE"))
.thenAccept(f -> System.out.println(f));
future
null
FUTURE
Apply関数は別の関数を適用し、値を保持する将来を渡します
Accept関数はこの値を消費し、将来の保持voidを返します