【Java】Optionalの使い方をサンプルコードを使って解説

OptionalはJava8から追加されたクラスになり、
nullでないオブジェクトを含めるために使用されるコンテナオブジェクトです。
値が存在しないnullを表すために使用されます。
このクラスには、コードがnull値をチェックする代わりに
「利用可能」または「利用不可能」として値を処理するための
さまざまなユーティリティメソッドがあります。

Optionalとは

Optionalはメソッドの戻り値として
nullを返す可能性があることを明示的に示したいときに使用します。
メソッドがnullを返す可能性があるということを示すことで、
そのメソッドを利用するプログラムをより安全に実装することができるようになります。

Optionalの書き方

宣言の仕方

まだ、ここまで見てもよく分からないと思います。
それではどのようにOptionalは使われるのでしょう?
例えば、下記のようなコードでメソッドgetValue()があったとします。
このメソッドはnullを返す場合があるとします。
これまでなら次のような感じでnullチェックをしていたと思います。

nullかもしれない変数valueのメソッドを呼ぶ場合、事前にnullチェックが必要ですが、
実装が漏れてしまうことがあります。
すると思っていなかったところでエラーが発生します。
これを無くすためにOptionalは便利です。
先ほどのコードをOptionalを使って書き換えると、以下のようになります。

まず、valueOptionalでgetValueメソッドで取得した値をラップ化することで
nullかどうかを確認しています。
そして、ifPresentメソッドを使用することで、値が存在する場合のみ実行するようにしています。
こうすることで、コードが少なくて済み、より安全に実装することができます。

Optionalの生成

Optionalを作成するにはいくつかの方法があります。
Optionalクラスにはインスタンス生成用のstaticメソッドが用意されているので、
これらを使って生成します。

メソッド 説明
Optional.empty() 値がnullのOptionalインスタンスを生成します。
Optional.of(値) 値に対するOptionalインスタンス生成します。
Optional.ofNullable(値) 値が null の場合はempty、nullでない場合はofメソッドの結果と同じ

Optionalから値を取得

Optionalで値を取り出すときは、メソッドを使います。
それぞれ値が存在しなかったときの振る舞いが違うので、それによってメソッドは必然的に決まります。

メソッド 値が存在する場合 値が存在しない場合
get() 値を返す。 NoSuchElementException
orElse(T other) 値を返す。 指定された値を返す。
orElseGet(Supplier other) 値を返す。 指定されたsupplierから生成した値を返す。
orElseThrow(Supplier exceptionSupplier) 値を返す。 指定されたsupplierから生成した例外を投げる。
boolean isPresent() 値を返す。 値が存在する場合はtrueを返し、それ以外の場合はfalseを返します。
void ifPresent(Consumer <?super T> consumer) 値があれば返す。 値が存在する場合は、指定されたコンシューマーをその値で呼び出します。それ以外の場合は何もしません。
int hashCode() 値を返す。 現在の値がある場合はそのハッシュコード値を返し、値がない場合は0(ゼロ)を返します。

他にもメソッドはありますので興味のある方は調べて見てください。

サンプルコードを実装

Optionalを使ったサンプルコードを書いてみます。

サンプルコード

出力結果

一番目のパラメータ: false
二番目のパラメータ: true

10

Writer

ST

株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。

最新の案件情報