地味ながら広範囲で役立つOptional

Java 8で追加されたクラスのうち、地味ながら広範囲で役に立つのがjava.util.Optionalだ。

これは「存在するかどうかわからない値」を表すための型で、このような値は従来のJavaではnullを使って表現することが多かったが、nullチェックが必要な値とそうでない値の区別がつかず、nullチェックを怠るとNullPointerExceptionが発生してしまうという問題があった。

このような場合にOptionalを使用することで「値が存在しないかもしれない」ということを明示することができ、nullチェックをわすれてしまうといった単純なミスを防止することができる。

Optionalのインスタンスは値の有無に応じて以下のようにして生成する。

// 値を持つOptionalオブジェクト(of()メソッドにはnullを渡すと例外がスローされる)
Optional<String> exist = Optional.of("123");
// 値を持たない空のOptionalオブジェクト
Optional<String> empty = Optional.empty();
// 値がnull以外の場合は値を持つOptional、nullの場合は空のOptionalを生成する
Optional<String> optional = Optional.ofNullable(value);

Optionalオブジェクトからは以下のようにして値を取得することができる。

// 値を取得(空の場合はNoSuchElementExceptionがスローされる)
String value1 = optional.get();
// 値を取得(空の場合は空文字列を返す)
String value2 = optional.orElse("");
// 値を取得(空の場合はラムダ式の結果を返す)
String value3 = optional.orElseGet(() -> {
  return new SimpleDateFormat("yyyyMMddHHmmSS").format(new Date());
});
// 値を取得(空の場合は例外をスローする)
String value4 = optional.orElseThrow(() -> new Exception("値がありません"));