Optionalについて調べてみた その2
【概要】
今回は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メソッドを使うのが良さそうです。