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 super T> action) { if (m_value == null) return(false); action.accept(m_value); m_value = m_next.apply(m_value); return(true); } }