gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:49:40 29 4
gpt4 key购买 nike

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());

提前非常感谢,

~本。

最佳答案

嗯,有办法,但是需要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())

关于lambda - Java8,将带有条件的for循环转换为lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42528287/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com