Java 8 Optional クラス

Java 8 新特性Java 8 新機能


Optional クラスは null を許容するコンテナオブジェクトです。値が存在する場合 isPresent() メソッドは true を返し、get() メソッドを呼び出すとそのオブジェクトを返します。

Optional はコンテナです。型 T の値を保持するか、単に null を保持することができます。Optional は便利なメソッドを多数提供するため、明示的に null チェックを行う必要がありません。

Optional クラスの導入により、NullPointerException をうまく解決できます。

クラス宣言

以下はjava.util.Optional<T>クラスの宣言です:

public final class Optional<T> extends Object

クラスメソッド

番号 メソッド & 説明
1 static <T> Optional<T> empty()

空の Optional インスタンスを返します。

2 boolean equals(Object obj)

他のオブジェクトが Optional と等しいかどうかを判定します。

3 Optional<T> filter(Predicate<? super <T> predicate)

値が存在し、その値が指定された predicate に一致する場合は、その値を表す Optional を返し、それ以外の場合は空の Optional を返します。

4 <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)

値が存在する場合は、Optional に含まれるマッピングメソッドに基づく値を返し、それ以外の場合は空の Optional を返します。

5 T get()

この Optional に値が含まれている場合はその値を返し、含まれていない場合は例外 NoSuchElementException をスローします。

6 int hashCode()

存在する値のハッシュコードを返し、値が存在しない場合は 0 を返します。

7 void ifPresent(Consumer<? super T> consumer)

値が存在する場合はその値で consumer を呼び出し、それ以外の場合は何も行いません。

8 boolean isPresent()

値が存在する場合はメソッドは true を返し、それ以外の場合は false を返します。

9 <U>Optional<U> map(Function<? super T,? extends U> mapper)

値がある場合は、それに対してマッピング関数を呼び出して戻り値を取得します。戻り値が null でない場合は、マッピングの戻り値を含む Optional を作成し、map メソッドの戻り値として返します。それ以外の場合は空の Optional を返します。

10 static <T> Optional<T> of(T value)

指定された非 null 値を持つ Optional を返します。

11 static <T> Optional<T> ofNullable(T value)

空でない場合は、Optional が表す指定値を返し、それ以外の場合は空の Optional を返します。

12 T orElse(T other)

値が存在する場合はその値を返し、それ以外の場合は other を返します。

13 T orElseGet(Supplier<? extends T> other)

値が存在する場合はその値を返し、それ以外の場合は other を呼び出し、other の呼び出し結果を返します。

14 <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)

値が存在する場合は含まれる値を返し、それ以外の場合は Supplier から継承された例外をスローします。

15 String toString()

デバッグに適した Optional の非 null 文字列表現を返します。

注意:これらのメソッドはjava.lang.Objectクラスから継承されています。


Optional インスタンス

以下の例を通して、Optional クラスの使用方法をよりよく理解できます。

Java8Tester.java ファイル

import java.util.Optional; public class Java8Tester { public static void main(String args[]){ Java8Tester java8Tester = new Java8Tester(); Integer value1 = null; Integer value2 = new Integer(10); //Optional.ofNullable - null パラメータを渡すことができます Optional<Integer> a = Optional.ofNullable(value1); //Optional.of - 渡されたパラメータが null の場合、例外 NullPointerException をスローします Optional<Integer> b = Optional.of(value2); System.out.println(java8Tester.sum(a,b)); } public Integer sum(Optional<Integer> a, Optional<Integer> b){ //Optional.isPresent - 値が存在するかどうかを判定します System.out.println("最初のパラメータの値が存在します:" + a.isPresent()); System.out.println("2番目のパラメータの値が存在します:" + b.isPresent()); //Optional.orElse - 値が存在する場合はそれを返し、それ以外の場合はデフォルト値を返します Integer value1 = a.orElse(new Integer(0)); //Optional.get - 値を取得します。値が存在する必要があります Integer value2 = b.get(); return value1 + value2; } }

上記のスクリプトを実行すると、出力結果は次のとおりです。

$ javac Java8Tester.java 
$ java Java8Tester
第一个参数值存在: false
第二个参数值存在: true
10

Java 8 新特性Java 8 新機能

その他の拡張