Optionalについて
nullの可能性のあるオブジェクトのラッパー。NullPointerExceptionを発生させない為に導入された仕組み。
Optionalオブジェクトの生成
public static Optional of(T value)
public static <T> Optional<T> of(T value) 指定された非null値を含むOptionalを返します。 型パラメータ: T - 値のクラス パラメータ: value - 存在する値、非nullである必要がある 戻り値: 存在する値でのOptional 例外: NullPointerException - valueがnullの場合。
public static Optional ofNullable(T value)
指定された値がnullでない場合はその値を記述するOptionalを返し、それ以外の場合は空のOptionalを返します。 型パラメータ: T - 値のクラス パラメータ: value - 記述する値(nullも可) 戻り値: 指定された値がnullでない場合は存在する値でのOptional、それ以外の場合は空のOptional
Optional<String> optional = Optional.ofNullable(new Random().nextBoolean() ? "hello" : null);
ofを使うケースなんてそもそもOptionalを使う必要がないのでは、、、
値の取り出し方
public T get()
このOptionalに値が存在する場合は値を返し、それ以外の場合はNoSuchElementExceptionをスローします。 戻り値: このOptionalが保持する非null値 例外: NoSuchElementException - 存在する値がない場合 関連項目: isPresent()
public boolean isPresent()
存在する値がある場合はtrueを返し、それ以外の場合はfalseを返します。 戻り値: 存在する値がない場合はtrue、それ以外の場合はfalse
public T orElse(T other)
存在する場合は値を返し、それ以外の場合はotherを返します。 パラメータ: other - 存在する値がない場合に返される値、nullも可 戻り値: 値(存在する場合)、それ以外の場合はother
Optional<String> optional = Optional.ofNullable(new Random().nextBoolean() ? "hello" : null); String value1 = optional.isPresent() ? optional.get() : "nullかよ"; String value2 = optional.orElse("nullかよ");
関数型インタフェースとあわせて使う
public T orElseGet(Supplier<? extends T> other)
値が存在する場合はその値を返し、そうでない場合はotherを呼び出し、その呼び出しの結果を返します。 パラメータ: other - Supplier(値が存在しない場合は、これの結果が返される) 戻り値: 値(存在する場合)、それ以外の場合はother.get()の結果 例外: NullPointerException - 値が存在せずotherがnullの場合
public void ifPresent(Consumer<? super T> consumer)
値が存在する場合は指定されたコンシューマをその値で呼び出し、それ以外の場合は何も行いません。 パラメータ: consumer - 値が存在する場合に実行されるブロック 例外: NullPointerException - 値が存在しconsumerがnullの場合
public Optional map(Function<? super T,? extends U> mapper)
値が存在する場合は、指定されたマッピング関数をその値に適用し、結果がnullでなければ結果を記述するOptionalを返します。それ以外の場合は空のOptionalを返します。 ここで、findFirstはOptional<String>を返してから、mapは求めているファイル(存在する場合)のOptional<FileInputStream>を返します。 型パラメータ: U - マッピング関数の結果の型 パラメータ: mapper - 値に適用するマッピング関数(存在する場合) 戻り値: 値が存在する場合はマッピング関数をこのOptionalの値に適用した結果を記述するOptional、それ以外の場合は空のOptional 例外: NullPointerException - マッピング関数がnullの場合
public Optional filter(Predicate<? super T> predicate)
値が存在し、それが指定された述語に一致する場合はその値を記述するOptionalを返し、そうでない場合は空のOptionalを返します。 パラメータ: predicate - 存在する場合は値に適用する述語 戻り値: 値が存在して値が指定された述語にマッチする場合は、このOptionalの値を記述するOptional、それ以外の場合は空のOptional 例外: NullPointerException - 述語がnullの場合
Optional<String> optional = Optional.ofNullable(new Random().nextBoolean() ? "hello" : null); String value3 = optional.orElseGet(() -> "nullかよ");
String str = new Random().nextBoolean() ? "hello" : null; if (str != null) { String result = "<" + str + ">"; System.out.println(result); }
↓
Optional<String> optional = Optional.ofNullable(new Random().nextBoolean() ? "hello" : null); optional.ifPresent((str) -> { String result = "<" + str + ">"; System.out.println(result); });
String str = new Random().nextBoolean() ? "hello" : null; List<String> list = null; if (str != null) { list = new ArrayList<String>(); list.add(str); } if (list != null) { System.out.println(list); }
↓
Optional<String> optional = Optional.ofNullable(new Random().nextBoolean() ? "hello" : null); Optional<List<String>> list = optional.map((str) -> { return List.of(str); }); list.ifPresent(System.out::println);