Udemyの人気コースが今なら80%OFF!

【Java入門】Optionalオブジェクト

【Java入門】Optionalオブジェクト

オブジェクトの参照がnullの場合、nullチェックをせずに参照しようとすると、NullPointerExceptionが発生する問題がありました。
Java8からはjava.util.Optionalを使うことで、この問題を回避できるようになります。

従来のnullチェック

!=などでnullチェックをしてNullPointerExceptionを回避していました。

Java

String str = null;

//nullではない場合、値を出力する。
if(str != null){
    System.out.println(str);
}

Optionalの使い方

値を取得する

値を取得するにはgetメソッドを使用します。

Java

//Optional型のオブジェクトを生成(値あり)
Optional<String> value = Optional.of("aiueo");

//Optional型のオブジェクトを生成(値なし)
Optional<String> kara = Optional.empty();

System.out.println("Optional型の値を出力1:" + value);
System.out.println("Optional型の値を出力2:" + value.get());

System.out.println("Optional型の値を出力3:" + kara);
System.out.println("Optional型の値を出力4:" + kara.get());

実行結果

Optional型の値を出力1:Optional[aiueo]
Optional型の値を出力2:aiueo
Optional型の値を出力3:Optional.empty
Exception in thread "main" java.util.NoSuchElementException: No value present
    at java.util.Optional.get(Optional.java:135)
    at test.Main.main(Main.java:11)
解説
Optional型のオブジェクトから値を取り出すにはgetメソッドを使用します。(8行目、11行目)
但し、値が存在しない場合は、NoSushElementExceptionが発生します。(11行目)

値が存在するかを判定する

値が存在するかを判定するにはisPresentメソッドを使用します。

Java

//Optional型のオブジェクトを生成(値あり)
Optional<String> value = Optional.of("aiueo");

//Optional型のオブジェクトを生成(値なし)
Optional<String> kara = Optional.empty();

//valueの値が存在するかをチェック。
if(value.isPresent()){
    System.out.println("値があります1");
}else{
    System.out.println("値がありません1");
}

//karaの値が存在するかをチェック。
if(kara.isPresent()){
    System.out.println("値があります2");
}else{
    System.out.println("値がありません2");
}

実行結果

値があります1
値がありません2

値が存在する場合にラムダ式を実行する

値が存在する場合にラムダ式を実行するにはisPresentメソッドを使用します。

Java

//Optional型のオブジェクトを生成(値あり)
Optional<String> value = Optional.of("aiueo");

//値が存在する場合にラムダ式を実行する。
value.ifPresent(s -> System.out.println(s + s));

実行結果

aiueoaiueo

値が存在しない場合にラムダ式を実行する

値が存在しない場合にラムダ式を実行するにはorElseGetメソッドを使用します。

Java

//Optional型のオブジェクトを生成(値なし)
Optional<String> kara = Optional.empty();

//値が存在しない場合に、ラムダ式を実行する。
String result = kara.orElseGet(() -> {return "値なし";});

System.out.println(result);

実行結果

値なし

値が存在しない場合にデフォルト値を返す

値が存在しない場合にデフォルト値を返すにはorElseメソッドを使用します。

Java

//Optional型のオブジェクトを生成(値あり)
Optional<String> value = Optional.of("aiueo");

//Optional型のオブジェクトを生成(値なし)
Optional<String> kara = Optional.empty();

//値が存在しない場合は、「000」を返す。
String result1 = value.orElse("000");
String result2 = kara.orElse("000");

//値を出力する。
System.out.println(result1);
System.out.println(result2);

実行結果

aiueo
000
解説
値が存在しない場合のデフォルト値を「000」としていたため、karaを基にしたresult2の場合だけ「000」が出力されます。(9行目)

値が存在しない場合に例外をスローする

値が存在しない場合に例外をスローするにはorElseThrowメソッドを使用します。

Java

//Optional型のオブジェクトを生成(値なし)
Optional<String> kara = Optional.empty();

//値が存在しない場合に例外をスローする。
kara.orElseThrow(() -> new Exception("Exception発生。"));

実行結果

Exception in thread "main" java.lang.Exception: Exception発生。
    at test.Main.lambda$0(Main.java:5)
    at java.util.Optional.orElseThrow(Optional.java:290)
    at test.Main.main(Main.java:5)

変数の値がnullでない場合は、値を持つOptional、変数がnullの場合は空のOptionalを生成する。

変数の値がnullでない場合は、値を持つOptional、変数がnullの場合は空のOptionalを生成するにはofNullableメソッドを使用します。

Java

String value = "aaa";

Optional<String> result1 = Optional.ofNullable(value);
System.out.println(result1.orElse("0"));


String kara = null;

Optional<String> result2 = Optional.ofNullable(kara);
System.out.println(result2.orElse("0"));

実行結果

aaa
0

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です