web-dev-qa-db-ja.com

thenAcceptとthenApplyの違い

CompletableFutureのドキュメントを読んでいます。thenAccept()の説明は

このステージが正常に完了すると、指定されたアクションの引数としてこのステージの結果で実行される新しいCompletionStageを返します。

thenApply()の場合

このステージが正常に完了すると、このステージの結果が提供された関数の引数として実行される新しいCompletionStageを返します。

誰でも簡単な例を使ってこの2つの違いを説明できますか?

24
Anqi Lu

完全なメソッドシグネチャを確認する必要があります。

CompletableFuture<Void>     thenAccept(Consumer<? super T> action)
<U> CompletableFuture<U>    thenApply(Function<? super T,? extends U> fn)

thenAcceptConsumerを取り、T=Void CF、つまり値を保持せず、完了状態のみを保持するCFを返します。

一方、thenApplyFunctionを取り、関数の戻り値を保持するCFを返します。

28
the8472

thenApplyは現在のステージの結果を返しますが、thenAcceptは返しません。

この記事を読む: http://codeflex.co/Java-multithreading-completablefuture-explained/

CompletableFuture methods

9
Yuri

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を返します

5
shahaf