Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 9のOptional.or()メソッドとは?null安全な代替値の取得方法を解説

Java 9で追加されたOptionalクラスの新メソッド

Java 9では、Optional<T>クラスにstream()or()ifPresentOrElse()という3つの新しいメソッドが追加されました。OptionalクラスはNullPointerException(ヌルポインタ例外)を防ぐために導入されたクラスであり、値が存在しない可能性を型レベルで明示することで、より安全で読みやすいコードの実現を可能にします。

or()メソッドは、値が存在する場合はその値を含むOptionalをそのまま返します。一方、値が存在しない(空のOptionalである)場合は、引数として渡したサプライヤ関数(Supplier)が生成した別のOptionalを返します。この仕組みにより、複数の候補から順番に値を探すような処理を簡潔に記述できます。

構文

public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)

引数には、代替となるOptionalを返すSupplier関数を指定します。重要なポイントとして、このサプライヤは元のOptionalが空の場合にのみ呼び出されるため、遅延評価が行われます。つまり、不要な場合は代替値の生成コストが発生しません。

コード例

import java.util.Optional;
import java.util.function.Supplier;

public class OptionalOrTest {
    public static void main(String args[]) {
        Optional<String> optional = Optional.of("TutorialsPoint");
        Supplier<Optional<String>> supplierString = () -> Optional.of("Not Present");
        optional = optional.or(supplierString);
        optional.ifPresent(x -> System.out.println("Value: " + x));

        optional = Optional.empty();
        optional = optional.or(supplierString);
        optional.ifPresent(x -> System.out.println("Value: " + x));
    }
}

実行結果

Value: TutorialsPoint
Value: Not Present

動作のポイント

この例では、次のような流れで処理が行われています。

  • 1回目:optionalに「TutorialsPoint」という値が存在するため、or()メソッドはサプライヤを呼び出さず、元の値を含むOptionalをそのまま返します。
  • 2回目:optionalがOptional.empty()(空)であるため、or()メソッドはサプライヤを実行し、「Not Present」を含む代替のOptionalを返します。

or()メソッドを使うメリット

  • nullチェックの排除:if文による煩雑なnull判定を書かずに、代替値の取得ロジックを宣言的に記述できます。
  • 遅延評価によるパフォーマンス向上:サプライヤは必要なときだけ実行されるため、重い初期化処理やDB検索などを無駄なく扱えます。
  • チェーン可能な設計:戻り値もOptionalなので、or()を連続して呼び出し、複数のフォールバック候補を優先順位付きで記述できます。

このように、Optional.or()メソッドは「値がなければ代わりの値を用意する」というよくあるパターンを、null安全性を保ちながらエレガントに実装するための強力な手段です。

  1. Java 9のdestroyForcibly()メソッドとは?プロセスを強制終了する方法を解説

    destroyForcibly() メソッドは、実行中のプロセスを強制的に終了(キル)するために使用されます。このメソッドは、プロセスが正常に終了しない場合や、フリーズ(応答停止)してしまった場合に特に役立ちます。 例えば、destroyForcibly() を呼び出した後でも isAlive() メソッドが true を返すことがあります。これは、OSレベルでの終了処理が完了するまでに時間差があるためです。また、destroyForcibly() は終了要求が正常に受け付けられた場合は true を返し、そうでない場合は false を返します。 構文 boolean destroyForc

  2. Java 8におけるインターフェースの機能強化 〜デフォルトメソッドと静的メソッド〜

    Java 8で導入されたインターフェースの新機能Java 8では、インターフェースに「デフォルトメソッド(default method)」という新しい概念が導入されました。この機能は後方互換性(下位互換性)を維持するために追加されたもので、既存のインターフェースを壊すことなく、Java 8の強力なラムダ式の恩恵を受けられるようにすることを目的としています。なぜデフォルトメソッドが必要だったのか例えば、従来のListやCollectionインターフェースにはforEachメソッドの宣言が存在しませんでした。ここで単純にforEachメソッドをインターフェースへ追加すると、これらのインターフェース