import java.lang.annotation.Annotation; import java.util.Arrays; import java.util.Collection; import java.util.Set; import java.util.function.Function; import java.util.stream.Collector; import java.util.stream.Collectors; abstract class FooBar { public static void checkAnnotationsPresent(final FooBar stream) { stream.collect ( toSet()); } abstract void collect(Collector collector); static Collector> toSet() { return null; } } class Boo { public static Set checkAnnotationsPresent(final Class klass, final Collection> wanted) { return wanted.stream() .filter(collectAnnotationTypes(klass)::contains) .map(ann -> klass.getAnnotation(ann)) .collect(Collectors.toSet()); } public static Set checkAnnotationsPresent1(final Class klass, final Collection> wanted) { return wanted.stream() .filter(collectAnnotationTypes(klass)::contains) .map(klass::getAnnotation) .collect(Collectors.toSet()); } public static Set> collectAnnotationTypes(final Class klass) { return Arrays.asList(klass.getAnnotations()).stream() .map(Annotation::annotationType) .collect(Collectors.toSet()); } } class Foor

{ public void checkAnnotationsPresent() { Function, Annotation> mapper = this::getAnnotation; } public A getAnnotation(Foor annotationClass) { return null; } static class Annotation{} } abstract class FooBoo { { map((Class ann) -> getAnnotation(ann)); map(this::getAnnotation); } abstract A getAnnotation(Class annotationClass); abstract void map(Function, ? extends R> mapper); }