Java8 Потоковая иерархия классов [дубликаты]

На этот вопрос уже есть ответ:

Java 8 Поток суперклассов, родительских файлов, родительских компонентов, связанного списка и т. Д. 2 ответа

Я медленно изучаю новые функции Java 8 и пытаюсь найти способ обработки иерархии классов (от дочерней к родительской) в виде потока.

Например, найдите аннотацию для класса или его родителей.

До Java 8 я бы сделал это так:

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;
}

Теперь я хочу сделать это с помощью более "функционального программирования". Я не смог найти лучшего способа, чем объединить потоки с рекурсивной записью врод

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);
    }
}

Но я не совсем доволен решением. Хотя я не тестировал его, я думаю, что конкатенация потоков довольно громоздка и неэффективна.

Есть ли лучший способ превратить рекурсив в поток?

Ответы на вопрос(1)

Ваш ответ на вопрос