Ben*_*nma 4 lambda functional-programming java-8
Java 8.
至少对我来说,将forEach循环转换为lambda表达式是可以理解的.另一方面,转换基于条件的for循环不是.
如果可能,我的问题是:如何将以下for循环转换为lambda表达式
List<Field> fields = new LinkedList<>();
for (Class<?> c = this.getClass(); c != null; c = c.getSuperclass())
Collections.addAll(fields, c.getDeclaredFields());
Run Code Online (Sandbox Code Playgroud)
提前谢谢了,
〜本.
嗯,有一种方法,但它需要takeWhile
它在jdk-9.
我在这里做一个映射来获取字段的名称.您必须@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()));
Run Code Online (Sandbox Code Playgroud)
jdk-9还引入了一个Stream.iterate
像Iterator一样的东西,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());
Run Code Online (Sandbox Code Playgroud)
并使用新的迭代方法:
Stream.iterate(this.getClass(), c -> c != null, (Class<?> c) -> c.getSuperclass())
.flatMap(c -> Arrays.stream(c.getDeclaredFields()))
.map(c -> c.getName())
.collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)