Optionalについて調べてみた その2

【前提条件】

[環境]
[参考資料]

Java8 APIドキュメント
Java Platform SE 8

【概要】

今回はOptionalを使った値の取得について調べてみました。

Optionalの値取得メソッドにどのようなものがあるか、
値が設定されている場合とされていない場合でどう動きが違うか
と言うところを調べてみました。

【取得メソッド】

今回、取得メソッドとして以下の4つについて調べてみました。

  • orElseメソッド
  • orElseGetメソッド
  • orElseThrowメソッド
  • getメソッド
[orElseメソッド]

前回のエントリで使用していたものです。
orElseメソッドはOptionalの値が設定されていなかった場合、
パラメータに指定したデフォルト値を返すと言うものです。

    value.orElse("default");
[orElseGetメソッド]

orElseメソッドと同じく値が設定されていなかった場合の
デフォルト値を指定します。
orElseメソッドとは関数オブジェクトがパラメータになっている点が異なります。

    value.orElseGet(() -> "test");
[orElseThrowメソッド]

orElseThrowは値が設定されていなかった場合に
例外をスローするためのメソッドです。

パラメータには例外を生成する関数オブジェクトを指定します。

    value.orElseThrow(() -> new RuntimeException("Throw RuntimeException"));
[getメソッド]

getメソッドはその名前のとおり値を取得するだけなのですが、
Optionalに値が設定されていない場合は
NoSuchElementExceptionガスローされます。

    value.get()

【設定値による結果の違い】

上記の4つのメソッドがOptionalの設定値によって
どう変わるかを見ていきます。

[コンソール出力用コード]

まずはOptionalで値を取得してコンソール出力させるメソッドを作ります。

    private static void outputConsole(final String label, final Optional<String> value) {

        System.out.println("===================== " + label + "  ====================="); 

        System.out.println("orElse : " + value.orElse("default"));
        System.out.println("orElseGet : " + value.orElseGet(() -> "test"));

        try {

            System.out.println("orElseThrow : " +
                    value.orElseThrow(() -> new RuntimeException("Throw RuntimeException")));
        } catch(final RuntimeException e) {
            
            System.out.println(e.getMessage());
        }

        try {

            System.out.println("get : " + value.get());
        } catch (final NoSuchElementException e) {

            System.out.println("Throw NoSuchElementException!");
        }

        System.out.println("===================== " + label + "  ====================="); 
    }

orElseThrowメソッドではRuntimeExceptionをキャッチしてメッセージを表示しています。
getメソッドではNoSuchElementExceptionをキャッチしています。

[サンプルコード]

サンプルコードでは以下の3パターンをコンソール出力します。

  • 値が設定されたOptional
  • 空文字が設定されたOptional
  • Nullが設定されのOptional(Optional#emptyで生成)
public class Sample {

    public static void main(final String[] args) {

        outputConsole("Not Empty", Optional.of("test"));
        outputConsole("Empty String", Optional.of(""));
        outputConsole("Null", Optional.empty());
    }
}
[実行結果]
===================== Not Empty  =====================
orElse : test
orElseGet : test
orElseThrow : test
get : test
===================== Not Empty  =====================
===================== Empty String  =====================
orElse : 
orElseGet : 
orElseThrow : 
get : 
===================== Empty String  =====================
===================== Null  =====================
orElse : default
orElseGet : test
Throw RuntimeException
Throw NoSuchElementException!
===================== Null  =====================

値が設定されている場合は
設定された値が出力されているのがわかります。
空文字も「空文字」が設定されているので出力されています。

Nullの場合はパラメータで設定したデフォルト値、
もしくは例外をスローしているのがわかります。

【まとめ】

取得系のメソッドを4つ試してみました。

Optionalを使えば1行でNullに関する値の取得が書けるようになりました。
ただし、getメソッドで例外が投げられてしまうのは
注意が必要になるかなと思います。

チェックが不要でデフォルト値が設定できる
orElseメソッドかorElseGetメソッドを使うのが良さそうです。