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

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)

提前谢谢了,

〜本.

Eug*_*ene 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()));
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)

  • @Benma你需要`takeWhile`才能在jdk-8中工作.这可以在`StreamEx`库中,也可以自己添加,直到可以从这里获得:http://stackoverflow.com/questions/20746429/limit-a-stream-by-a-predicate (2认同)