ClassCastException を配慮した cast 処理

instanceof 演算子で if文を書くのが嫌な時、
Class の isInstance メソッドで制御したOptional変数で処理する方法、、、
単に cast する。

Food f = Optional.of(pasta)
   .filter(e->Food.class.isInstance(e))
   .map(e->Food.class.cast(e))
   .orElse(null);

cast 成功なら処理する

Optional.of(pasta)
   .filter(e->Food.class.isInstance(e))
   .map(e->Food.class.cast(e))
   .ifPresent(e->{
      // TODO cast済の e の処理
   });

cast できる時とできない時の処理を書く。。
Java8 用

Optional.of(object)
   .filter(e->Food.class.isInstance(e))
   .map(e->Food.class.cast(e))
   .<Runnable>map(e->()->{
      // TODO cast済の e の処理
   }).orElse(()->{
      // TODO cast不可能の処理
   }).run();

Java10~

Optional.of(object)
.filter(e->Foo.class.isInstance(e))
.map(e->Foo.class.cast(e))
.ifPresentOrElse(e->{
   // TODO cast済の e の処理
}, ()->{
   // TODO cast不可能の処理
});

cast 結果を Optional として返すFunction を戻り値にした static メソッド
ClassCastException 発生時の処理を書けるようにしたメソッド

static <T, R> Function<T, Optional<R>> castFunction(Class<R> cls, Consumer<ClassCastException> cs){
   return (T t)->{
      try{
         return Optional.of(cls.cast(t));
      }catch(ClassCastException e) {
         cs.accept(e);
         return Optional.empty();
      }
   };
}
Optional<Food> f = castFunction(Food.class, x->{}).apply(pasta);

instanceof 演算子コンパイル時にチェックしてくれる、むしろチェックしてしまうのではなく
あくまでも実行時に cast したい時の記述として、上記を考えた。