2.2. optional
もちろん出題されます!むしろ、Java SE 11 Goldにおいては Stream APIとセットで必ずと言っていいほど出題される超重要項目 です。
特に、Streamの終端操作(findFirst, max, reduceなど)の戻り値として登場するため、Optionalのメソッドを正確に理解していないと、Streamの問題全体を落としてしまう可能性があります。
試験で狙われるポイントを整理しました。
1. Optionalの基本:生成と値の取得¶
値があるかないかという「状態」をどう扱うかが問われます。
Optional.of(value): 値がnullだとNullPointerExceptionが発生します。Optional.ofNullable(value): 値がnullなら空のOptionalを返します。get(): 値がない(empty)状態で呼び出すとNoSuchElementExceptionが発生します。- 試験では「いきなり
get()を呼んで例外になる」パターンがよく出ます。
- 試験では「いきなり
2. 値がない場合の代替処理(頻出!)¶
ここが最も試験に出る部分です。3つのメソッドの違いを完璧に区別してください。
| メソッド | 特徴 |
|---|---|
orElse(T other) |
値がなくてもあっても、引数の other は**常に評価(実行)**されます。 |
orElseGet(Supplier) |
値がない時**だけ**、Supplierが実行されます。 |
orElseThrow() |
値がない時に例外を投げます。(SE 11では引数なしだと NoSuchElementException) |
ひっかけの例:
orElse(someMethod())と書かれている場合、Optionalに値が入っていてもsomeMethod()は実行されてしまいます。ログ出力やDB操作が引数にある場合、その副作用に注意が必要です。
3. Optional の「型」と変換¶
Streamと同様、プリミティブ用のOptionalが存在します。
- プリミティブ用:
OptionalInt,OptionalLong,OptionalDouble - 値の取得メソッド名:
get()ではなく、getAsInt(),getAsLong(),getAsDouble()です。 - 中間操作:
filter,map,flatMapはOptional<T>にも存在します。Optional<String> s = Optional.of("JAVA");s.map(String::length).ifPresent(System.out::println); // 4
4. Java 9 / 11 で追加されたメソッド¶
SE 11の試験範囲には、比較的新しいメソッドも含まれます。
ifPresentOrElse(Consumer, Runnable): 値があればConsumerを実行、なければRunnableを実行。or(Supplier<Optional>): 値がない場合に、別のOptionalを返す(orElseGetは「値そのもの」を返すが、orは「Optional」を返す)。stream(): Optionalを要素が0個または1個のStreamに変換します。
5. 試験に出る「典型的なダメなコード」¶
以下のようなコードが選択肢に混じっていたら注意してください。
Optionalを引数やフィールドに使う: 本来、Optionalは戻り値として使うよう設計されています。文法違反ではありませんが、設計指針として推奨されないため、試験の問題文で「適切な使い方はどれか」と問われることがあります。nullを直接代入する:Optional<String> opt = null;は最悪です(ぬるぽの原因になります)。正しくはOptional.empty()です。
次のステップへの提案¶
OptionalとStreamの組み合わせ問題は、コードが長くなりがちで「何が返ってくるか」を見失いやすいです。
次は、「OptionalとStreamが組み合わさった練習問題」**を解いてみますか? それとも、先ほど少し触れた **「JDBC(データベース)」 や 「並列処理」 の詳細に進みますか?