[java] Optional<T>について
Optionalクラスは何らかの処理の結果を格納・保持するクラスです。
これまでは取得した値が空ではないか、またはnullではないかなど、取得結果について確認したうえで後続の処理を行っている場合があり、これが冗長・可読性低下の原因でした。
Java8から導入されたOptionalクラスを使うと、こういったケースが簡潔に記述できるようになりました。
ここではインスタンスの生成と、値を使用するにあたって利用する主なメソッドについてまとめておきます。
インスタンスの生成
OptionalのインスタンスはOptionalインターフェースに定義されたファクトリメソッドを使用して生成します。
empty() | 空のOptionalのインスタンスを生成する。 |
---|---|
of(T value) | nullを許容しない値を持ったOptionalのインスタンスを生成する。 nullを指定するとNullPointerExceptionが発生する。 |
ofNullable(T value) | nullを許容し、nullを指定した場合は空のOptionalインスタンスを生成する。 |
emptyメソッド
コード例
Optional<String> optional = Optional.empty();
System.out.println(optional);
実行結果
Optional.empty
ofメソッド
コード例
Optional<String> optional = Optional.of("test");
System.out.println(optional);
実行結果
Optional[test]
- ofメソッドにnullを指定するとNullPointerExceptionが発生する。
ofNullableメソッド
コード
Optional<String> optional = Optional.ofNullable(null);
System.out.println(optional);
実行結果
Optional.empty
Optionalインスタンスの主なメソッド
値の取得と検証に関する主なメソッドは以下の通りです。
get() | インスタンスに設定された値を取得する。 値がnullの場合、または空のインスタンス[Optional.empty]の場合、例外が発生する。 |
---|---|
isPresent() | インスタンスに値が設定されているかを確認する。 値がnullの場合、または空のインスタンス[Optional.empty]の場合、falseを返却する。 |
isEmpty() | 空のOptionalインスタンスかどうかを確認する。 値がnullの場合、または空のインスタンス[Optional.empty]の場合、trueを返却する。 |
orElse(T other) | 値がnullの場合、または空のインスタンス[Optional.empty]の場合、引数の値で新たなOptionalインスタンスを生成する。 |
orElseThrow() | 値がnullの場合、または空のインスタンス[Optional.empty]の場合、例外を発生させる。 |
getメソッド
コード例
Optional<String> val = Optional.ofNullable("test");
System.out.println(val.get());
実行結果
test
- 値がnullの場合、または空のインスタンス[Optional.empty]の場合にgetメソッドを使用するとNoSuchElementExceptionが発生する。
isPresentメソッド
コード例
Optional<String> val1 = Optional.ofNullable("test");
System.out.println("test : " + val1.isPresent());
Optional<String> val2 = Optional.ofNullable(null);
System.out.println("null : " + val2.isPresent());
Optional<String> val3 = Optional.empty();
System.out.println("empty : " + val3.isPresent());
実行結果
test : true null : false empty : false
isEmptyメソッド
コード例
Optional<String> val1 = Optional.ofNullable("test");
System.out.println("test : " + val1.isEmpty());
Optional<String> val2 = Optional.ofNullable(null);
System.out.println("null : " + val2.isEmpty());
Optional<String> val3 = Optional.empty();
System.out.println("empty : " + val3.isEmpty());
実行結果
test : false null : true empty : true
orElseメソッド
コード例
Optional<String> val = Optional.ofNullable(null); System.out.println(val.orElse("default-value"));
実行結果
default-value
orElseメソッド
コード例
Optional<String> val = Optional.ofNullable(null);
System.out.println(val.orElseThrow());
実行結果
Exception in thread "main" java.util.NoSuchElementException: No value present at java.base/java.util.Optional.orElseThrow(Optional.java:382)
関数型インターフェースを引数に取る主なメソッド
関数型インターフェースを引数に取るメソッドは、取得した値に対して加工などの処理を行うことが出来ます。
関数型インターフェースについては、以下の記事を参照してください。
https://www.s-watanabe.work/2022/11/java.html#toc_headline_5
orElseGet(Supplier) | 値がnullの場合、または空のインスタンス[Optional.empty]の場合に、Supplierインターフェースで生成された値を返す。 |
---|---|
filter(Predicate) | 指定条件に合致しないOptionalの値を、emptyに置き換える。 |
map(Function) | Optionalの値を加工して置き換えたOptionalのインスタンスを返す。 |
orElseGetメソッド
コード例
Optional<String> val = Optional.ofNullable(null);
System.out.println(val.orElseGet(() -> "supplier"));
実行結果
supplier
filterメソッド
コード例
Optional<String> val = Optional.ofNullable("test");
System.out.println(val.filter((x) -> x == "value"));
実行結果
Optional.empty
mapメソッド
コード例
Optional<String> val = Optional.ofNullable("test"); System.out.println(val.map((x) -> x + "-function"));
実行結果
Optional[test-function]
- 値がnull、emptyの場合は何もせずに[Optional.empty]を返す。
コメント
コメントを投稿