【Java 9】Optionalクラスに追加された3つの新メソッド(or / ifPresentOrElse / stream)を解説
Optionalクラスは、null以外の値を保持しているかもしれないし、保持していないかもしれない——そんな状態を表現できるコンテナを提供します。このクラスはJava 8で導入され、コード中でNullPointerExceptionが発生しうる箇所を減らすことを目的としています。さらにJava 9では、デフォルト値の扱いをより柔軟にするための3つの新メソッド、or()、ifPresentOrElse()、stream()が追加されました。
Optional.or()
or()メソッドはJava 9で導入され、引数として関数型インターフェースのSupplierを受け取ります。このメソッドは常に「空ではないOptional」を返すのが特徴です。元のOptionalオブジェクトに値が存在すればそのオブジェクト自身を返し、空の場合はSupplierが生成した新しいOptionalオブジェクトを返します。
サンプルコード
import java.io.IOException;
import java.util.Optional;
public class OptionalOrMethodTest {
public static void main(String[] args) throws IOException {
String str = null;
Optional<String> opt = Optional.ofNullable(str);
Optional<String> result = opt.or(() -> Optional.of("Adithya"));
System.out.println(result);
}
}
実行結果
Optional[Adithya]
Optional.ifPresentOrElse()
ifPresentOrElse()メソッドもJava 9で追加されました。既存のifPresent()メソッドとよく似ていますが、異なるのはRunnable型の引数が1つ追加されている点です。これにより、Optionalオブジェクトが空だった場合に実行する代替処理を、ラムダ式などで簡潔に指定できます。
サンプルコード
import java.util.Optional;
public class OptionalIfPresentOrElseTest {
public static void main(String[] args) {
String str = null;
Optional<String> opt = Optional.ofNullable(str);
opt.ifPresentOrElse(
x -> System.out.println(x),
() -> System.out.println("No value"));
}
}
実行結果
No value
Optional.stream()
stream()メソッドはJava 9以降で利用できます。Optionalオブジェクトから新しいStreamオブジェクトを生成するためのメソッドで、Optionalが値を保持していれば、その値を含むStreamを返します。特に、複数のOptionalを含むリストから空の要素を除外して値だけを抽出したい場合に、flatMap(Optional::stream)と組み合わせると非常に便利です。
サンプルコード
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
public class OptionalStreamMethodTest {
public static void main(String[] args) {
List<Optional<String>> list = List.of(
Optional.of("Jai"),
Optional.empty(),
Optional.of("Adithya"));
Stream<String> stream = list.stream().flatMap(Optional::stream);
stream.forEach(System.out::println);
}
}
実行結果
Jai Adithya
まとめ
Java 9で追加されたor()、ifPresentOrElse()、stream()の3つのメソッドを活用することで、nullチェック、デフォルト値の設定、複数のOptionalを扱う処理を、より簡潔かつ安全に記述できるようになります。NullPointerExceptionを未然に防ぎながら可読性の高いコードを実現するために、ぜひ日常の開発で活用してみてください。
-
Java 9における@Deprecatedアノテーションの改善点とは?新要素「since」「forRemoval」を徹底解説
@Deprecatedアノテーションとはクラス、メソッド、フィールドなど、プログラム内のあらゆる要素に付与できる@Deprecatedアノテーションは、「その要素はもはや使用すべきではない」ことを示すためのものです。要素が非推奨とされる主な理由は以下の通りです。使用すると危険であり、エラーを引き起こす可能性がある将来のバージョンで互換性がなくなる可能性がある将来のバージョンで削除される可能性があるより優れた、効率的な代替手段がすでに提供されているJava 9で追加された2つの新しい要素Java 9では、@DeprecatedアノテーションにsinceとforRemovalという2つの新しい属性
-
JavaにおけるCursorクラスの役割とは?マウスカーソル制御の基本を解説
JavaのCursorクラスとはCursorクラスは、Objectクラスのサブクラスであり、画面上のポイント(指し示す位置)やインジケーター(表示標識)として定義されます。ユーザーがマウスを使ってシステムへの入力を選択・操作する際に、その位置を視覚的に示す重要な役割を担っています。GUIアプリケーションでは、状況に応じてカーソルの形状を変えることで、ユーザーに対して直感的なフィードバックを提供できます。例えば、処理中であることを伝える砂時計型のカーソルや、クリック可能な要素を示す手型のカーソルなどが代表的な例です。利用可能なカーソルの種類Cursorクラスには、あらかじめ定義されたさまざまなカ