Java10 の Optional orElseThrowメソッド

元々、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メソッド
});