Optionalについて調べてみた その3
【概要】
今回は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内部の値に対して処理を書いたほうが良さそうですね。