今週は、Java の CompletableFuture について詳しく説明します。
フロントエンドのバックグラウンドを持つフルスタック開発者として、ネットワークリクエストやバックグラウンド計算などの非同期タスクを扱うことは私の役割の避けられない部分です。 Java では、CompletableFuture は、メインスレッドの応答性を維持しながらこれらのタスクを処理するための強力なツールです。
Java にとっての完全な Future は、JavaScript にとっての Promise と同じです。
JavaScript に精通している場合は、両方の言語を比較してこれらの概念を理解するのに役立つかもしれません。私は CompletableFuture を Promise の Java 版と考えるのが好きです。これは、非同期操作の最終的な結果 (結果が成功か失敗か) を表すクラスです。 Java 8 で java.util.concurrent パッケージの一部として導入されたこれは、Promises と同様に、操作を連鎖させたりエラーを処理したりするメソッドを備えた、ノンブロッキング コードを記述する強力な方法です。
ここで 2 つの簡単な比較を示します:
// JavaScript Promise fetchFromServer() .then(data => processData(data)) .then(result => updateUI(result)) .catch(error => handleError(error));
// Java CompletableFuture CompletableFuture.supplyAsync(() -> fetchDataFromServer()) .thenApply(data -> processData(data)) .thenAccept(result -> updateUI(result)) .exceptionally(error -> handleError(error));
上に示したように、CompletableFuture は、クリーンで読みやすい非同期コードを可能にする、同様のチェーン可能な構文を提供します。
ユーザーのプロフィール データと注文履歴を 2 つの別個のエンドポイントから取得する必要があるシナリオを考えてみましょう。これらのリクエストが完了するのを待っている間に UI がフリーズすることは避けたいでしょう。 CompletableFuture を使用してこれを実装する方法は次のとおりです:
CompletableFuture<User> profileFuture = CompletableFuture.supplyAsync(() -> { // Fetch user profile from a service }); CompletableFuture<List<Order>> ordersFuture = CompletableFuture.supplyAsync(() -> { // Fetch user orders from another service }); CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(profileFuture, ordersFuture); combinedFuture.thenRun(() -> { User user = userFuture.join(); List<Order> orders = ordersFuture.join(); displayUserData(user, orders); });
この例では、2 つの非同期リクエストを同時にトリガーし、allOf を使用して両方が終了するのを待ちます。完了したら、メインスレッドをブロックすることなく、結果を取得し、それに応じて UI を更新します。
CompletableFuture は、連鎖操作の基盤を提供する CompletionStage インターフェイスを実装します。 thenApply、thenAccept、および同様のメソッドはそれぞれ別の CompletionStage を返し、複雑な非同期パイプラインを作成できます。
一連の非同期タスクを次々に実行する場合に、JavaScript で Promise を連鎖させる方法と同様に、コールバック地獄に陥ることなく、依存する非同期操作のシーケンスを作成するために、Completable Future 内でタスクを連鎖させることができます。 。その方法は次のとおりです:
CompletableFuture.supplyAsync(() -> "Hello") .thenApply(result -> result + ", CompletableFuture") .thenApply(result -> result + " in Java") .thenAccept(System.out::println);
Promise オブジェクトには .catch() がありますが、Completable Future には .Exceptionally() があります。このメソッドは、非同期処理中に発生する可能性のある例外を処理します:
CompletableFuture.supplyAsync(() -> { if (true) { throw new RuntimeException("Exception in CompletableFuture!"); } return "No exception"; }).exceptionally(ex -> { System.out.println("Handled exception: " + ex); return "Recovered value"; }).thenAccept(System.out::println);
この記事が CompletableFuture クラスをさらに詳しく調べるための良い出発点になれば幸いです。
役立つリンク:
以上が今週私が学んだのは: CompletableFuture – 非同期プログラミングへの Java のアプローチの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。