如何创建Stream
类祖先?
我能做的是:
public static Stream<Class<?>> streamOfAncestors(Class<?> klass) {
ArrayList<Class<?>> ancestorsList = new ArrayList<>();
while (true) {
klass = klass.getSuperclass();
if (klass == null) {
return ancestorsList.stream();
} else {
ancestorsList.add(klass);
}
}
}
但它不优雅,我的流不是懒惰。如何制作一个懒惰的Stream
?
答案 0 :(得分:2)
一种选择是使用Stream.iterate()
。您必须将它与takeWhile
(在Java 9中引入)结合使用才能使Stream
有限。
public static Stream<Class<?>> streamOfAncestors(Class<?> klass) {
return Stream.iterate (klass.getSuperclass(), k -> k != null ? k.getSuperclass() : null)
.takeWhile(Objects::nonNull);
}
或者,如果您不想使用Java 9功能,可以编写类似于Stream.iterate()
的方法,但要使其生成有限的Stream
:
public static Stream<Class<?>> streamOfAncestors(Class<?> klass) {
final Iterator<Class<?>> iterator = new Iterator<Class<?>>() {
@SuppressWarnings("unchecked")
Class<?> k = klass.getSuperclass ();
@Override
public boolean hasNext() {
return k != null;
}
@Override
public Class<?> next() {
Class<?> curr = k;
k = k.getSuperclass ();
return curr;
}
};
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(
iterator,
Spliterator.ORDERED | Spliterator.IMMUTABLE), false);
}
第二种方法的示例执行:
streamOfAncestors (StringBuilder.class).forEach (System.out::println);
输出:
class java.lang.AbstractStringBuilder
class java.lang.Object
编辑:
正如Holger评论的那样,如果您使用的是Java 9,则所有这些都不是必需的,它具有Stream.iterate变体,可生成有限Stream
。
您需要写的只有:
public static Stream<Class<?>> streamOfAncestors(Class<?> klass) {
return Stream.iterate (klass.getSuperclass(), Objects::nonNull, Class::getSuperclass);
}