【Java】Optionalの使い方をサンプルコードを使って解説
OptionalはJava8から追加されたクラスになり、
nullでないオブジェクトを含めるために使用されるコンテナオブジェクトです。
値が存在しないnullを表すために使用されます。
このクラスには、コードがnull値をチェックする代わりに
「利用可能」または「利用不可能」として値を処理するための
さまざまなユーティリティメソッドがあります。
Optionalとは
Optionalはメソッドの戻り値として
nullを返す可能性があることを明示的に示したいときに使用します。
メソッドがnullを返す可能性があるということを示すことで、
そのメソッドを利用するプログラムをより安全に実装することができるようになります。
Optionalの書き方
宣言の仕方
1 2 |
import java.util.Optional public final class Optional<T> extends Object |
まだ、ここまで見てもよく分からないと思います。
それではどのようにOptionalは使われるのでしょう?
例えば、下記のようなコードでメソッドgetValue()があったとします。
このメソッドはnullを返す場合があるとします。
これまでなら次のような感じでnullチェックをしていたと思います。
1 2 3 4 5 6 7 |
String value = getValue(); // valueはgetValueの戻り値を受け取る if (value != null) { // nullチェックを行う System.out.println(value.length()); // lengthメソッドを呼ぶ } |
nullかもしれない変数valueのメソッドを呼ぶ場合、事前にnullチェックが必要ですが、
実装が漏れてしまうことがあります。
すると思っていなかったところでエラーが発生します。
これを無くすためにOptionalは便利です。
先ほどのコードをOptionalを使って書き換えると、以下のようになります。
1 2 |
Optional<String> valueOptional = Optional.ofNullable(getValue()); valueOptional.ifPresent(hoge -> System.out.println(hoge.length())); |
まず、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 extends T> other) | 値を返す。 | 指定されたsupplierから生成した値を返す。 |
orElseThrow(Supplier extends X> exceptionSupplier) | 値を返す。 | 指定されたsupplierから生成した例外を投げる。 |
boolean isPresent() | 値を返す。 | 値が存在する場合はtrueを返し、それ以外の場合はfalseを返します。 |
void ifPresent(Consumer <?super T> consumer) | 値があれば返す。 | 値が存在する場合は、指定されたコンシューマーをその値で呼び出します。それ以外の場合は何もしません。 |
int hashCode() | 値を返す。 | 現在の値がある場合はそのハッシュコード値を返し、値がない場合は0(ゼロ)を返します。 |
他にもメソッドはありますので興味のある方は調べて見てください。
サンプルコードを実装
Optionalを使ったサンプルコードを書いてみます。
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import java.util.Optional; public class Sample { public static void main(String args[]) { Sample sample = new Sample(); int value1 = null; int value2 = new int(10); Optional<int> a = Optional.ofNullable(value1); Optional<int> b = Optional.of(value2); System.out.println(java8Tester.sum(a,b)); } public int sum(Optional<int> a, Optional<int> b) { System.out.println("一番目のパラメータ: " + a.isPresent()); System.out.println("二番目のパラメータ: " + b.isPresent()); int value1 = a.orElse(new int(0)); int value2 = b.get(); return value1 + value2; } } |
出力結果
一番目のパラメータ: false
二番目のパラメータ: true
10
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。