Java Gold SE11対策:Optionalの必須知識を徹底整理!

Java Gold SE11では、Java 8以降に導入されたOptionalが試験頻出のトピックです。
Optionalはnullを安全に扱うためのラッパークラスで、正しく使えばコードの可読性と堅牢性が大きく向上します。
本記事では、Java Goldに必要なOptionalの知識を論点ごとに厳選して解説します。暗記すべきメソッド、試験での引っかけポイント、mapやfilterとの使い方の違いなども網羅しています。
目次
1. Optionalとは何か
Optional<T>は、T型の値を保持しているかもしれないし、していないかもしれないということを明示的に表現するクラスです。
Optional<String> name = Optional.of(“Alice”);
Optional<String> empty = Optional.empty();
- Optional.of(value) は null を渡すと NullPointerException
- Optional.ofNullable(value) は null を許容
2. よく使うメソッド(用途と分類)
メソッド | 用途 | 戻り値 |
isPresent() | 値の存在確認(非推奨) | boolean |
ifPresent(Consumer) | 値がある場合に処理 | void |
get() | 値を取得(null時例外) | T |
orElse(T) | なければデフォルト値を返す | T |
orElseGet(Supplier) | なければ関数で生成(遅延) | T |
orElseThrow() | なければ例外をスロー | T |
filter(Predicate) | 条件に合わない場合emptyに | Optional<T> |
map(Function) | 値を変換 | Optional<U> |
flatMap(Function) | Optional<Optional<U>>を平坦化 | Optional<U> |
3. orElse vs orElseGet の違い(試験で出やすい!)
String value = optional.orElse(“default”);
String value2 = optional.orElseGet(() -> “default”);
違いは評価タイミング!
- orElse(…) → 値があっても処理が呼ばれる(常に評価)
- orElseGet(…) → 値がないときだけ実行(遅延評価)
String result = optional.orElse(expensiveOperation()); // ← 常に呼ばれる!
String result = optional.orElseGet(() -> expensiveOperation()); // ← 必要なときだけ
4. mapとflatMapの違い(Optionalで超重要)
mapは値を変換
Optional<String> name = Optional.of(“Java”);
Optional<Integer> len = name.map(String::length); // Optional<Integer>
flatMapはOptionalのネストを解消
Optional<String> name = Optional.of(“Java”);
Optional<Optional<Integer>> nested = name.map(s -> Optional.of(s.length()));
Optional<Integer> flat = name.flatMap(s -> Optional.of(s.length())); // ← flatMapで1重に
試験でのポイント
- map:Optional → Optional<別の値>
- flatMap:Optional → Optional<Optional<別の値>> → 平坦化
- 違いを正確に覚えること!
5. filterの動作(mapと組み合わせる問題が頻出)
Optional<String> name = Optional.of(“Java”);
int length = name
.filter(s -> s.startsWith(“J”))
.map(String::length)
.orElse(0);
- filterの条件に合えばそのまま
- 合わなければOptional.empty()
- その後のmapやorElseにどう影響するかを問う問題が多い!
6. Optionalの設計方針(実務にも出る)
- Optionalは戻り値に使うことが推奨される(引数やフィールドには非推奨)
- nullを避けたい場所で使う → Optional.ofNullable(…)
- Optional.get() は使用非推奨(isPresentとの併用も避ける)
7. Java 9以降の新機能(試験には出る可能性あり)
Optional.stream()
List<Optional<String>> list = List.of(Optional.of(“a”), Optional.empty());
List<String> flatList = list.stream()
.flatMap(Optional::stream) // Java 9以降!
.collect(Collectors.toList());
→ OptionalをStreamのパイプラインに取り込むことが可能に!
まとめチェックリスト(覚えるべきこと)
- Optional.of(null) → 例外
- orElse は常に評価、orElseGet は遅延評価
- mapとflatMapの違い → ネスト解消できるのはflatMap
- filterで条件を満たさないとOptional.empty()になる
- get()は避け、orElseやorElseThrowを使う
- OptionalのstreamはJava 9以降!
おわりに
Java Gold SE11では、Optionalに関する知識がstreamやlambdaと密接に絡んで出題されます。
今回のように使い方を整理しておけば、「型がどう変わるか」「どのメソッドが呼ばれるか」といった実装レベルの問題にも迷わず対応できます。
Optionalは実務でも極めて重要なパーツ。nullを消すことができる武器として、確実に身につけていきましょう。