[java] Optional<T>について

Optionalクラスは何らかの処理の結果を格納・保持するクラスです。

これまでは取得した値が空ではないか、またはnullではないかなど、取得結果について確認したうえで後続の処理を行っている場合があり、これが冗長・可読性低下の原因でした。

Java8から導入されたOptionalクラスを使うと、こういったケースが簡潔に記述できるようになりました。

ここではインスタンスの生成と、値を使用するにあたって利用する主なメソッドについてまとめておきます。

インスタンスの生成

OptionalのインスタンスはOptionalインターフェースに定義されたファクトリメソッドを使用して生成します。

1. 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インスタンスの主なメソッド

値の取得と検証に関する主なメソッドは以下の通りです。

2. 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

3. 関数型インターフェースを引数に取る主なメソッド
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]を返す。

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

docker-compose で起動したweb、MySQLに接続できない事象

【PHP】PHP_CodeSnifferを使う(コーディングルールのカスタマイズ)