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);