Optionalについて調べてみた その3

【前提条件】

[環境]
[参考資料]

Java8 APIドキュメント
Java Platform SE 8

【概要】

今回はOptionalを使ったNullのチェックについて調べてみました。

【isPresentメソッド】

isPresentメソッドはOptionalオブジェクトに値が設定されているかを
チェックするメソッドです。

    final Optional<String> value = Optional.of("test");
    if (value.isPresent()) {
    }

動きとしては下記のコードとほぼ同じです。

    final Optional<String> value = Optional.of("test");
    if (value.get() != null) {
    }

ただし、getメソッドは値がNullだった場合に
NoSuchElementExceptionをスローするので、
isPresentメソッドを使ったほうがいいです。

【ifPresent】

ifPresentメソッドは値が設定されている場合に
パラメータで渡した関数オブジェクトの処理が行われます。

    final Optional<String> value = Optional.of("test");
    value.ifPresent(v -> System.out.println(v));

これは下記のコードと同じです。

    final Optional<String> value = Optional.of("test");
    if (value.isPresent()) {
        System.out.println(value.get());
    }

Nullチェックして、Optionalオブジェクトから値を取得して・・・
といったことが簡単に行えるメソッドです。

【動きを見てみる】

実際にコード書いて出力結果が動違うかを見てみます。

[サンプルコード]
public class Sample {
    
    public static void main(final String[] args) {

        outputConsole("Not Empty", Optional.of("test"));
        outputConsole("Empty String", Optional.of(""));
        outputConsole("Null", Optional.empty());
    }

    private static void outputConsole(final String label, final Optional<String> value) {

        System.out.println("===================== " + label + "  ====================="); 

        System.out.println("isPresent : " + value.isPresent());

        value.ifPresent(v -> System.out.println("ifPresent : " + v));

        System.out.println("===================== " + label + "  ====================="); 
    }
}

前回と同じく3つのパターンに対して、
isPresentメソッド、ifPresentメソッドを実行した場合の
コンソール出力を行います。

[出力結果]
===================== Not Empty  =====================
isPresent : true
ifPresent : test
===================== Not Empty  =====================
===================== Empty String  =====================
isPresent : true
ifPresent : 
===================== Empty String  =====================
===================== Null  =====================
isPresent : false
===================== Null  =====================

Null以外の場合はisPresentがtrueで、
ifPresentではコンソール出力がされていることがわかります。

Nullの場合はisPresentがfalseで、
ifPresentではコンソール出力がされていないことがわかります。

【おまけ】

ifPresentメソッドで何がうれしいのかと言うと
Nullチェックが少し省略できるくらいです。

しかし、パラメータで受け取るのが関数オブジェクトなので、
↓のような曲芸(?)的なコードもかけます。

    private static void executeLoopFunctions() {

        final List<Consumer<String>> consumers = new ArrayList<>();
        consumers.add(v -> System.out.println("one : " + v));
        consumers.add(v -> System.out.println("two : " + v));
        consumers.add(v -> System.out.println("three : " + v));

        final Optional<String> value = Optional.of("test");
        consumers.forEach(func -> value.ifPresent(func));
    }

今までは処理に対してオブジェクトをループさせていたと思います。

    for(Data data : dataList) {

        if (data != null) {
            func1();
            func2();
            func3();
        }
    }

StreamAPIと組み合わせれば、
オブジェクトに対して処理をループさせるやり方ができそうです。

それが良いやり方かどうかは別ですが。

【まとめ】

OptionalオブジェクトのNullのチェックについて見てきました。

基本的にはOptional#ifPresentメソッドを使って、
Optional内部の値に対して処理を書いたほうが良さそうですね。