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);
}
}
Но я не совсем доволен решением. Хотя я не тестировал его, я думаю, что конкатенация потоков довольно громоздка и неэффективна.
Есть ли лучший способ превратить рекурсив в поток?