第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