Java8,将带有条件的循环转换为lambda

时间:2017-03-01 09:43:43

标签: 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());

非常感谢,

〜奔。

2 个答案:

答案 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表达式。