类祖先的Java流

时间:2018-01-25 06:51:28

标签: java java-8 java-stream

如何创建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

1 个答案:

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