LoginSignup
5

More than 5 years have passed since last update.

いまさら始めるJava8 ~Optional~

Posted at

第1回:いまさら始めるJava8 ~forEachとラムダ式~
第2回:いまさら始めるJava8 ~StreamAPI~
第3回:いまさら始めるJava8 ~日付時刻API~

Optionalとは、null以外の値を持つかもしれないし、持たないかもしれないものを扱うクラスです
Optional<String>は何か文字列を持つかもしれないし、持たないかもしれないという型です

Optionalの生成

値を持たない

Optional emptyCase = Optional.empty();

空のOptionalを生成します

値を必ず持つ

Optional presentCase = Optional.of("example");

値を持つOptionalを生成します
引数にnullを渡した場合、NullPointerExceptionが発生します

値を持つかもしれないし、持たないかもしれない

Optional nullableNullCase = Optiona.ofNullable(null);
Optional nullableNotNullCase = Optiona.ofNullable("example");

引数がnullであれば空のOptionalを、そうでなければ引数の値を持つOptionalを生成します

Optionalの利用

値があるか判定する

isPresent

値を持つ場合はtrue, 持たない場合はfalseを返します

Optional presentCase = Optional.of("example");
presentCase.isPresent();  // true

Optional emptyCase = Optional.empty();
emptyCase.isPresent();  // false

ifPresent

値を持つ場合は引数のConsumerを値を引数にとって実行し、持たない場合は何もしません

Optional presentCase = Optional.of("example");
presentCase.ifPresent(s -> {System.out.println(s)});  // 標準出力に"example"と出力

Optional emptyCase = Optional.empty();
emptyCase.ifPresent(s -> {System.out.println(s)});  // 何もしない

値を取得する

get

値を持つ場合はその値を返し、値を持たない場合はNoSuchElementExceptionがthrowされます

Optional presentCase = Optional.of("example");
presentCase.get();                    // example

Optional emptyCase = Optional.empty();
emptyCase.get();                      // NoSuchElementException が発生

値を持つことを期待している場合に使います
値を持たない場合にデフォルト値を使いたい場合は次のorElseを使ったほうがよいです

orElse

値を持つ場合はその値を返し、値を持たない場合は引数で指定した値を返します

Optional presentCase = Optional.of("example");
presentCase.orElse("default");                    // example

Optional emptyCase = Optional.empty();
emptyCase.orElse("default");                      // default

orElseGet

値を持つ場合はその値を返し、値を持たない場合は引数で指定したSupplierの結果を返します

Optional presentCase = Optional.of("example");
presentCase.orElseGet(() -> {"default"});          // example

Optional emptyCase = Optional.empty();
emptyCase.orElseGet(() -> {"default"});           // default

orElseとの違いは、デフォルト値を直接渡すかラムダ式で表すかです

orElseThrow

値を持つ場合はその値を返し、値を持たない場合は引数で指定したSupplierで例外をthrowします

値を利用する

map

値を持つ場合は引数のマッピング関数をその値に適用し、結果がnullでなければ結果を記述するOptionalを返します。それ以外の場合は空のOptionalを返します

Optional<String> presentCase = Optional.of("example,1,exp");
Optional<String[]> result = presentCase.map(name -> name.split(",")); // [example, 1, exp]

Optional<String> emptyCase = Optional.empty();
Optional<String[]> result = emptyCase .map(name -> name.split(",")); // 空のOptional

filter

StreamAPIのfilterと同じような働きをします
引数のラムダ式の条件に一致する場合は元のOptionalを返し、そうでない場合は空のOptionalを返します

Optional<String> presentCase =Optional.of("example");
Optional<String> match = presentCase.filter(exp -> exp.length() == 7); // "example"

Optional<String> notMatch = presentCase.filter(exp -> exp.length() != 7); // 空のOptional

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5