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());
非常感谢,
〜奔。
答案 0 :(得分:5)
嗯,有一种方法,但它需要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()));
jdk-9还引入了Stream.iterate
,其作用类似于seed, hasNext, next
的迭代器,更适合您的情况。
您可以使用 StreamEx库获取此btw:
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())
答案 1 :(得分:0)
您可能想要使用流。在列表中打开一个流,只需使用过滤器。 Filter采用FunctionalInterface / Lambda表达式。