Optionalクラスとは
Optionalクラスとは、Java SE8で追加されたクラスであり、値が存在しているかどうかの有無を判定しながらデータを扱うことができる超便利クラスである。NullPointerExceptionを避けるために使う方も多いのではないだろうか。ブログ主も幾度となくお世話になった。 これまでの記事では既に利用している(こことか、こことか、こことか、こことか)。個人的にOptionalを使う際には、下記のようなお決まりの流れがある。
- 値の存在チェック(isPresent, isEmpty, …)
- 値の取得など(get)
1と2の流れを一緒にしてまとめたメソッドとして、orElseやorElseGetといったものが用意されている。ここでは「基本的な1と2の流れ」の確認と、「1と2の流れをまとめたメソッドの利用」を実装してみたい。
Optionalを実装してみる
確認には「取得した値が入っていた場合」と「取得した値がNULLだった場合」の2パターンで実施してみる。
基本的な1と2の流れ
引数に応じてOptionalのクラスに値を渡し、NULLの場合は「値が入っていません!」を、値が入っていた場合はその値を表示する(今回の場合は「100」が表示される)。 メソッドとしてはNULLの値も許容するofNullable、存在有無のチェックを行い存在しない場合にはtrueを返却するisEmpty、値を取得するgetの3つを利用している。
public class Main { public static void main(String[] args) { System.out.println("=== NULLのケース ==="); test1(null); System.out.println("=== 100のケース ==="); test1(100); } static void test1(Integer integer){ Optional<Integer> test = Optional.ofNullable(integer); if(test.isEmpty()){ System.out.println("値が入っていません!"); } else { System.out.println(test.get().toString()); } } }
実行結果
=== NULLのケース ===
値が入っていません!
=== 100のケース ===
100
1と2の流れをまとめたメソッドの利用
引数に応じてOptionalのクラスに値を渡し、NULLの場合は「値が入っていません!」を、値が入っていた場合はその値を表示する(今回の場合は「100」が表示される)。要は基本的な1と2の流れと同じ表示が期待される。メソッドとしてはNULLの値も許容するofNullable、存在有無のチェック結果に応じて指定した処理を行うifPresentOrElseの二つ。Consumerの関数型インタフェースを利用している。
public class Main { public static void main(String[] args) { System.out.println("=== NULLのケース ==="); test2(null); System.out.println("=== 100のケース ==="); test2(100); } static void test2(Integer integer){ Optional<Integer> test = Optional.ofNullable(integer); test.ifPresentOrElse( i -> System.out.println(i.toString()), () -> System.out.println("値が入っていません!") ); } }
実行結果
=== NULLのケース ===
値が入っていません!
=== 100のケース ===
100
Optionalを使わない場合
引数に応じてOptionalのクラスに値を渡し、NULLの場合は「値が入っていません!」を、値が入っていた場合はその値を表示する(今回の場合は「100」が表示される)。要は基本的な1と2の流れと同じ表示が期待される。メソッドとしてはNULLの値も許容するofNullable、存在有無のチェック結果に応じて指定した処理を行うifPresentOrElseの二つ。Consumerの関数型インタフェースを利用している。
public class Main { public static void main(String[] args) { System.out.println("=== NULLのケース ==="); test2(null); System.out.println("=== 100のケース ==="); test2(100); } static void test3(Integer integer){ System.out.println(integer.toString()); } }
実行結果
== NULLのケース ===
Exception in thread "main" java.lang.NullPointerException
at org.example.Main.test3(Main.java:16)
at org.example.Main.main(Main.java:10)
まとめ
Optionalクラスが戻り値の型として設定されているメソッドもあるため、Javaを勉強する際には避けては通れないクラスだと思う。業務で使われることも多いが、用意されているメソッドも使いやすく覚えやすいので実際に使いながら覚えていって欲しい。