Java:Optionalチートシート

2018年12月12日

頭が悪くて良く使い方を忘れるのでチートシートを書いておく。ウェブ検索すると、やたらに説明書きの多いものがあるのだが、これらは不要だ。概念はわかっているので、使い方だけわかればいい。

作成

    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());