嗯,有一种方法,但需要使用jdk-9中的takeWhile
。
我正在进行一个映射,以获取字段的名称。您需要在方法中添加@SuppressWarnings("null")
。
System.out.println(Stream.iterate(this.getClass(), (Class<?> x) -> x.getSuperclass())
.takeWhile(x -> x != null)
.flatMap(c -> Arrays.stream(c.getDeclaredFields()))
.map(c -> c.getName())
.collect(Collectors.toList()));
jdk-9还引入了一个Stream.iterate
,它的行为像一个带有seed, hasNext, next
的迭代器,非常适合您的情况。
顺便提一下,您可以使用StreamEx库来实现:
StreamEx.of(Stream.iterate(this.getClass(), (Class<?> x) -> x.getSuperclass()))
.takeWhile(x -> x != null)
.flatMap(c -> Arrays.stream(c.getDeclaredFields()))
.map(c -> c.getName())
.collect(Collectors.toList());
使用新的迭代方法:
Stream.iterate(this.getClass(), c -> c != null, (Class<?> c) -> c.getSuperclass())
.flatMap(c -> Arrays.stream(c.getDeclaredFields()))
.map(c -> c.getName())
.collect(Collectors.toList())