【发布时间】:2016-10-25 12:50:26
【问题描述】:
我正在慢慢学习 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);
}
}
但我对解决方案不太满意。虽然我没有对其进行基准测试,但我认为流连接非常麻烦且性能不佳。
有没有更好的方法将递归变成流?
【问题讨论】:
-
本质上,您正在寻找
takeWhile(遍历超类并在它不为空时获取),请参阅stackoverflow.com/questions/20746429/… -
takeWhile()出现在 Java 9 中。此外,Stream.iterate()的 3-arg 版本,可以模拟for样式的循环。
标签: reflection java-8 java-stream