Java 8超级类流,父文件,组件父项,链表等

我想将以下for语句转换for Java 8流(即Stream<Class> )。 理想的解决方案很简单,我可以轻松地适应各种遍历链表的情况(例如File.getParentFile()Component.getParent() )。

  Class clazz; Object value; value = ...; for (clazz = value.getClass(); clazz != null; clazz = clazz.getSuperclass()) ... 

我意识到创建流的几行代码不会比单个for语句简单。 但是,流使for循环的主体更简单,因此需要流。

您需要一个takeWhile在JDK-9中出现的takeWhile方法。 目前,您可以使用可用的后端口,例如,在我的StreamEx库中:

 Stream> stream = StreamEx.iterate(value.getClass(), Class::getSuperClass) .takeWhile(Objects::nonNull); 

在JDK-9中,只需用Stream替换StreamEx

这是与问题中提供的相同的代码,但使用Spliterator实现。 我希望有人能想出一个更简单,更聪明的答案。

  Class clazz; Object value; value = ...; >walkLinks(value.getClass(), Class::getSuperclass). ... public static  Stream walkLinks(T start, Function next) { WalkLinks walker; Stream result; walker = new WalkLinks<>(start, next); result = StreamSupport.stream(walker, false); return(result); } private static class WalkLinks extends Spliterators.AbstractSpliterator { private final Function m_next; private T m_value; public WalkLinks(T value, Function next) { super(Long.MAX_VALUE, Spliterator.ORDERED + Spliterator.NONNULL); m_value = value; m_next = next; } @Override public boolean tryAdvance(Consumer action) { if (m_value == null) return(false); action.accept(m_value); m_value = m_next.apply(m_value); return(true); } }