Skip to content
閲覧中:
6. Optionalの連携(76-85)

6. Optionalの連携(76-85)

Java Gold試験において、OptionalはStream APIの終端操作(findFirstmaxなど)の戻り値として頻繁に登場します。特にJava 9以降で追加されたメソッド(ifPresentOrElsestream())は、試験での注目度が高いポイントです。

76番から85番までのサンプルコードを解説します。


76-80: 生成と値の取得

Java
// 76. ofNullable: nullかもしれない値から生成
String name = null;
Optional<String> opt = Optional.ofNullable(name);

// 77. ifPresent: 値がある場合のみ実行
opt.ifPresent(s -> System.out.println("Name: " + s));

// 78. ifPresentOrElse (Java 9+): 値がある場合とない場合の両方の処理を記述
opt.ifPresentOrElse(
    s -> System.out.println("Found: " + s),
    () -> System.out.println("Not found")
);

// 79. orElse: 値がない場合のデフォルト値(常に評価される)
String result = opt.orElse("Default");

// 80. orElseGet: 値がない場合のデフォルト値(必要になった時だけSupplierが実行される)
String resultGet = opt.orElseGet(() -> "Default from Supplier");

81-85: 例外・変換・Stream連携

Java
// 81. orElseThrow: 値がない場合に例外を投げる
// 引数なしは NoSuchElementException (Java 10+)
String val = opt.orElseThrow(() -> new IllegalArgumentException("Empty!"));

// 82. filter: 条件に合わなければ空のOptionalにする
Optional<String> filtered = opt.filter(s -> s.length() > 5);

// 83. map: 値を変換する(戻り値がOptionalに包まれる)
Optional<Integer> len = opt.map(String::length);

// 84. flatMap: 戻り値がOptionalを返す関数と連結する(二重のOptionalを防ぐ)
Optional<String> upper = opt.flatMap(s -> Optional.of(s.toUpperCase()));

// 85. stream() (Java 9+): Optionalを要素1つ(または0個)のStreamに変換
// これにより、StreamのflatMap内でOptionalをスマートに扱える
List<String> list = opt.stream()
                       .map(String::toLowerCase)
                       .collect(Collectors.toList());

💡 Java Gold 試験対策の急所

1. map vs flatMap

試験で最も間違えやすいポイントです。

  • opt.map(s -> Optional.of(s)) と書くと、戻り値は Optional<Optional<String>> になってしまいます。
  • 戻り値が Optional である関数を繋げる場合は、必ず flatMap を使い、型を平坦化する必要があります。

2. orElse vs orElseGet の動作の違い

試験では「メソッドの実行回数」を問う問題が出ます。

  • orElse(getValue()): 値が存在していても、getValue() は**必ず実行**されます。
  • orElseGet(() -> getValue()): 値が存在する場合、getValue() は**実行されません**(遅延評価)。

3. Optional.stream() の活用

Java 9以降、Stream<Optional<T>>Stream<T> に変換する際、flatMap(Optional::stream) を使う手法が定番となりました。これは「値があるものだけを抽出してアンラップする」非常に効率的な方法です。


これで100本ノックの85番まで完了しました。 最後は 86-100番「試験で狙われる特殊仕様・ひっかけ」 です。ここを制覇すればStream APIは完璧です。最後のセクションに進みますか?