オブジェクトの参照が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行目)
但し、値が存在しない場合は、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