Java8 Streaming de uma hierarquia de classes [duplicado]

Esta pergunta já tem uma resposta aqui:

Java 8 Fluxo de Super Classes, Arquivos Pais, Pais Componentes, lista vinculada, etc 2 respostas

Estou aprendendo lentamente os novos recursos do Java 8 e estou tentando encontrar uma maneira de processar uma hierarquia de classes (de filho para pai) como um flux

or exemplo, encontre uma anotação em uma classe ou em seus pai

Antes do Java 8, eu teria feito desta maneira:

public static <T extends Annotation> T getAnnonationOn(Class<?> type, Class<T> annType) {
    Class<?> t = type;
    T annot = null;
    while (t != null && annot == null) {
        annot = t.getAnnotation(annType);
        t = t.getSuperclass();
    }
    return annot;
}

gora, eu desejo fazê-lo de uma maneira mais "funcional". Não consegui encontrar uma maneira melhor do que concatenar fluxos com uma recursiva como segue:

import java.lang.annotation.Annotation;
import java.util.stream.Stream;

public static <T extends Annotation> T getAnnonationOn(Class<?> type, Class<T> annType) {
    return ClassIterator.streamSuperclass(type)
        .map(t -> t.getAnnotation(annType))
        .filter(a -> a != null)
        .findFirst()
        .orElse(null);
}

public static class ClassIterator {
    public static Stream<Class<?>> streamSuperclass(Class<?> type) {
        if (type.getSuperclass() != null) {
            return Stream.concat(Stream.of(type), Stream.of(type.getSuperclass()).flatMap(ClassIterator::streamSuperclass));
        }
        return Stream.of(type);
    }
}

Mas não estou muito satisfeito com a solução. Embora eu não tenha feito o benchmark, acho que a concatenação do fluxo é bastante complicada e com baixo desempenh

Existe uma maneira melhor de transformar uma recursiva em um flux