import java.util.List; import java.util.Optional; class A { void foo(B b) { Optional.of(b) .flatMap(A::flatipus1) .flatMap(A::flatipus2); } private static Optional<C> flatipus1(B b) { return Optional.empty(); } private static Optional<B> flatipus2(C c) { return Optional.empty(); } void bar(List<C> cs) { cs.stream() .map(B.class::cast) .filter(A::bool); } private static boolean bool(B b) { return true; } } class B {} class C extends B {}