6. Optionalの連携(76-85)
Java Gold試験において、OptionalはStream APIの終端操作(findFirstやmaxなど)の戻り値として頻繁に登場します。特にJava 9以降で追加されたメソッド(ifPresentOrElseやstream())は、試験での注目度が高いポイントです。
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は完璧です。最後のセクションに進みますか?