Java8,将带有条件的for循环转换为lambda表达式

4

Java 8.

将forEach循环转换为lambda表达式是可以理解的,至少对我来说是这样的。 但是,将基于条件的for循环转换为lambda表达式则不是那么容易。

如果可能的话,我的问题是: 如何将以下for循环转换为lambda表达式

List<Field> fields = new LinkedList<>();
        for (Class<?> c = this.getClass(); c != null; c = c.getSuperclass())
            Collections.addAll(fields, c.getDeclaredFields());

非常感谢您的帮助。

~Ben.


Lambda在这里不会帮助你。如果你想获取包括继承的类的所有字段,请尝试这个解决方案:https://dev59.com/x3NA5IYBdhLWcg3wPLL- - esin88
我不同意被接受的答案,即递归是更好的方法,我的归纳代码效果更好。 - Benma
我非常想知道我的问题是否有可能。 - Benma
我想更加专注于函数式编程 @esin88 - Benma
2
相关:流式传输类层次结构 - Holger
显示剩余2条评论
2个回答

5

嗯,有一种方法,但需要使用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())

Stream.iterate(this.getClass(), c -> c != null, (Class<?> c) -> c.getSuperclass()) .flatMap(c -> Arrays.stream(c.getDeclaredFields())) .map(c -> c.getName()) .collect(Collectors.toList()) - Benma
只有使用Java9才可能实现吗? - Benma
2
@Benma,你需要使用takeWhile才能在jdk-8中运行。这要么在StreamEx库中,要么你可以自己添加,直到从这里获得:https://dev59.com/YmIi5IYBdhLWcg3w_QmH - Eugene
1
@Roland 确实,一个从迭代器中产生的流。 - Eugene

0

你可能想要使用流(stream)来处理。在列表上打开一个流,然后简单地使用过滤器(filter)。过滤器需要一个函数式接口/lambda表达式。


我非常熟悉流和过滤器,但是使用这些方法来实现以下循环条件对我来说并不直观,是否有可能提供一些代码片段? - Benma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接