13
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

JavaのOptionalで値存在時/非存在時の処理を書く際の指針

Last updated at Posted at 2018-01-29

JavaのOptionalで値存在時/非存在時の処理を書く際、次の3つのメソッドを使用することができます。

  • Optional.isPresent()
  • Optional.ifPresent()
  • Optional.ifPresentOrElse()(Java 9以降)

どういう場合にどのメソッドを使うべきか、僕なりの指針を考えてみました。

各メソッドの仕様

Optional.isPresent()

Optional.isPresent()は、値が存在する場合はtrue、存在しない場合はfalseを返すメソッドです。
if~else文と組み合わせて使うことで、従来のnullチェックの構文をほぼそのまま置き換えることができます。
もっとも、そのような使い方は**「ただnullチェックを置き換えただけで、Optionalを使う意味がない」**とも言われています。

final Optional<String> foo = Optional.ofNullable("foo");

if (foo.isPresent()) {
	System.out.println("foo=" + foo.orElse(""));
} else {
	System.out.println("foo is null");
}

Optional.ifPresent()

Optional.ifPresent()は、値が存在する場合は引数で指定した関数(Consumer)を実行するメソッドです。
値が存在しない場合の処理を記述できず、関数内でブロック外の変数を書き換えられないという制約があります。

final Optional<String> foo = Optional.ofNullable("foo");

foo.ifPresent(f -> System.out.println("foo=" + f));

Optional.ifPresentOrElse()

Optional.ifPresentOrElse()は、値が存在する場合は引数で指定した1個目の関数(Consumer)を実行し、存在しない場合は引数で指定した2個目の関数(Runnable)を実行するメソッドです。
値が存在しない場合の処理を記述できますが、関数内でブロック外の変数を書き換えられないという制約があります。

final Optional<String> foo = Optional.ofNullable("foo");

foo.ifPresentOrElse(f -> System.out.println("foo=" + f), () -> System.out.println("foo is null"));

フローチャート

どういう場合にどのメソッドを使うべきかのフローチャートです。

https://qiita-image-store.s3.amazonaws.com/0/132608/149d5aab-1032-6390-c4b1-01f209874ec4.png

基本的にはOptional.ifPresent()を使用し、ブロック外の変数を書き換えたい場合や、値が存在しない場合の処理を記述したい場合のみ他のメソッドを使うのがよさそうです。

参考リンク

13
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?