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 したい時の記述として、上記を考えた。