元々、Java8 以降で、Optional の get() を使うことは、Optional の目的、性質からしてあまりなかった。
Java10 になっても、get() は、Deprecated アノテーションはついてない。
https://bugs.openjdk.java.net/browse/JDK-8160606
と、OpenJDK でこの先、Deprecated がはっきり示されたのかというと、
https://bugs.openjdk.java.net/browse/JDK-8140281
で、ひっくり返ったみたい。
そこで、Java10 で登場したのが、orElseThrowメソッド
↓ これはよく説明されるコード、、
Optional<Integer> anyOddInStream = Stream.of(2, 4, 6, 8) .filter(x->x % 2 == 1) .findAny(); int value = anyOddInStream.orElseThrow();
orElseThrow() と書くと直感的に get() よりも値が取得できないリスクを見やすい。
「見た目」だけの話のような気もするけど、単純にそれで充分なのかも。。
orElseThrow() は、値が無い時、NoSuchElementException で、RuntimeException 系あることも注意点だ。
Optional.orElseThrow(Supplier<? extends X> exceptionSupplier)
という Supplier であることも、便利かも。
Java8 の頃の、、、
Optional<Object> item; item.<Runnable>map(e->()->{ // 存在する時の処理 }).orElse(()->{ // 存在しない時の処理 }) .run();
Java9 からの、、
Optional.ofNullable(object).ifPresentOrElse(e->{ // NULLでない時の処理、Consumer }, ()->{ // NULL の時の Runnableメソッド });