Java - CompletableFuture APIの改善
こんにちは、将来のJava開発者たち!私は、JavaのCompletableFuture APIの改善について探索するこの興奮的な旅にあなたと共に乗り出すことができることに胸を躍らせています。プログラミングが初めてであれば心配しないでください。基本から始めて、少しずつ進んでいきます。このチュートリアルの終わりには、あなたがどれだけ学んだかに驚くことでしょう!
CompletableFutureとは?
改善点に踏み込む前に、まずCompletableFutureとは何かを理解しましょう。複雑な料理をしているとしましょう。パスタが沸騰するのを待ってから野菜を切るなんて、無駄ですよね?CompletableFutureは、厨房に複数のシェフがいて、それぞれ異なる作業を同時に進めるようなものです。これはJavaが非同期プログラミングを処理する方法で、コードが同時に複数のことを行うことを許可します。
基本的なCompletableFutureの例
簡単な例から始めましょう:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello, Future!";
});
System.out.println(future.get());
このコードでは、Stringを返すCompletableFutureを作成しています。supplyAsync
メソッドは、コードを別のスレッドで実行します。スレッドが1秒間sleepすることで、何か作業をシミュレートしています。その後、メッセージを返します。get()
メソッドは、Futureが完了するのを待ち、結果を返します。
遅延とタイムアウトのサポート
CompletableFuture APIの魅力的な改善の1つは、遅延とタイムアウトのサポートが強化されたことです。これは、厨房でタイマーを設定するようなものです -ソースが無限に煮詰まらないようにしたいですよね!
遅延の例
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(s -> s + ", World!")
.completeOnTimeout("Timeout occurred", 2, TimeUnit.SECONDS)
.orTimeout(3, TimeUnit.SECONDS);
System.out.println(future.get());
この例では、Futureが「Hello」と言い、それを「Hello, World!」に変更しています。以下の新しいメソッドを2つ使用しています:
-
completeOnTimeout
:2秒以内にFutureが完了しない場合、デフォルトの値で完了します。 -
orTimeout
:3秒以内にFutureが完了しない場合、例外をスローします。
このようにして、何かが間違った場合にコードが無限に停止しないように確保します。
サブクラス化の改善
CompletableFutureクラスは今ではサブクラス化しやすくなり、独自の特殊なバージョンを作成することができます。これは、自分のニーズに合わせたカスタムキッチン機器を作れるようなものです!
サブクラス化の例
public class MyFuture<T> extends CompletableFuture<T> {
@Override
public <U> MyFuture<U> thenApply(Function<? super T, ? extends U> fn) {
return (MyFuture<U>) super.thenApply(fn);
}
// 他のオーバーライドされたメソッド...
}
MyFuture<String> myFuture = new MyFuture<>();
myFuture.complete("Hello, Custom Future!");
System.out.println(myFuture.get());
この例では、CompletableFuture
を拡張した独自のMyFuture
クラスを作成しています。thenApply
メソッドをオーバーライドして、カスタムFutureタイプを返しています。これにより、操作をチェーンしながらもカスタムタイプを保持できます。
新しいファクトリメソッド
Javaは、CompletableFutureを作成するさらに簡単な新しいファクトリメソッドを導入しました。これは、コokableのレシピがあるようなものです!
ファクトリメソッドの表
メソッド | 説明 |
---|---|
failedFuture(Throwable ex) | 例外で既に完了したCompletableFutureを作成します |
completedStage(T value) | 指定された値で既に完了したCompletionStageを作成します |
failedStage(Throwable ex) | 例外で既に完了したCompletionStageを作成します |
ファクトリメソッドの例
CompletableFuture<String> successFuture = CompletableFuture.completedFuture("Success!");
CompletableFuture<String> failedFuture = CompletableFuture.failedFuture(new Exception("Oops!"));
try {
System.out.println(successFuture.get());
System.out.println(failedFuture.get());
} catch (Exception e) {
System.out.println("An error occurred: " + e.getMessage());
}
この例では、completedFuture
メソッドを使用して既に成功したFutureを作成し、failedFuture
メソッドを使用して既に失敗したFutureを作成しています。これはテストや同期と非同期のコードの統合に便利です。
結論
哇!今日は多くのことをカバーしました。CompletableFutureの基本から新しい改善点まで、Javaの非同期プログラミングの世界に初めて踏み込んだあなたの第一歩です。料理を学ぶのと同じで、これらの概念をマスターするには練習が必要です。実験を恐れず、間違ったことを恐れずに - それが学びの一番の方法です!
私が教えてきた年月の中で、優秀な生徒はコードに手を付けて失敗を恐れない生徒たちです。ですので、これらの例を取り入れ、修正し、壊してみてください。それがどのように動作するかを本当に理解する一番の方法です。
この章を終えるにあたり、ある生徒が私に言ったことが頭に浮かびます。彼はCompletableFutureを学ぶことは、ジャグリングを学ぶのと同じで、最初は全てのボールを空気中に浮かべることが不可能に思えるが、練習を重ねることで自然なものになる、と述べました。ですから、練習を続け、間もなく複雑な非同期操作をプロのようにこなすことができるようになるでしょう!
未来のJavaマスターたち、ハッピーコーディング!
Credits: Image by storyset