Java:Optionalチートシート
頭が悪くて良く使い方を忘れるのでチートシートを書いておく。ウェブ検索すると、やたらに説明書きの多いものがあるのだが、これらは不要だ。概念はわかっているので、使い方だけわかればいい。
作成
Optional<String>r0 = Optional.empty();
Optional<String>r1 = Optional.of("abc"); // null引数はだめ
Optional<String>r2 = Optional.ofNullable("abc"); // 引数はnullでもよい
変換
Optional<String>strOpt = Optional.of("abc");
// 三文字以外の文字列とする
Optional<String>r0 = strOpt.filter(s->s.length() != 3);
System.out.println(r0); // -->Optional.empty
// 文字列の長さ整数のOptionalを取得
Optional<Integer>r1 = strOpt.map(String::length);
System.out.println(r1); // -->Optional[3]
// 文字列の長さ整数のOptionalのOptional
Optional<Optional<Integer>>r2 = strOpt.map(s->Optional.of(s.length()));
System.out.println(r2); // -->Optional[Optional[3]]
// 文字列の長さ整数のOptional
Optional<Integer>r3 = strOpt.flatMap(s->Optional.of(s.length()));
System.out.println(r3); // -->Optional[3]
結果取得
Optional<String>str = Optional.of("abc");
// 中身があるかを調べる
if (str.isPresent()) {
// 中身を取得。空のときはNoSuchElementException例外
String r0 = str.get();
}
// 中身のあるときにだけ出力
str.ifPresent(System.out::println);
// 中身があればそれを、なければ"xyz"を返す。
String r0 = str.orElse("xyz");
// 中身があればそれを、なければラムダ式を実行した結果を返す。
String r1 = str.orElseGet(()-> { return "xyz"; });
// 中身があればそれを返し、なければラムダ式を実行した結果の例外を発生する
String r2 = str.orElseThrow(()->new RuntimeException());