CompletableFutureのチェーン
CompletableFutureを使ってブロッキングなしに非同期操作をチェーンする。
コード比較
✕ Pre-Java 8
Future<String> future =
executor.submit(this::fetchData);
String data = future.get(); // blocks
String result = transform(data);
✓ Java 8+
CompletableFuture.supplyAsync(
this::fetchData
)
.thenApply(this::transform)
.thenAccept(IO::println);
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
チェーン可能
非同期のステップを可読なパイプラインに組み合わせられます。
ノンブロッキング
結果待ちでスレッドがアイドルになりません。
エラーハンドリング
exceptionally()とhandle()でクリーンなエラー回復が可能です。
旧来のアプローチ
ブロッキングFuture.get()
モダンなアプローチ
CompletableFuture
JDKバージョン
8
難易度
中級
JDKサポート
CompletableFutureのチェーン
利用可能
JDK 8(2014年3月)以降、広く利用可能
仕組み
CompletableFutureはノンブロッキングな非同期パイプラインを実現します。thenApply、thenCompose、thenAcceptで操作をチェーンし、exceptionally()でエラーを処理します。allOf/anyOfで複数のFutureを組み合わせられます。
関連ドキュメント