Skip to content
閲覧中:
2.2. optional

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, flatMapOptional<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(データベース)」「並列処理」 の詳細に進みますか?