相关疑难解决方法(0)

递归流

我想使用Java 8以递归方式列出计算机上的所有文件.

Java 8提供了listFiles一种返回所有文件和目录但没有递归的方法.如何使用它来获取完整的递归文件列表(不使用变异集合)?

我已经尝试了下面的代码,但它只有一个深度:

static Function<Path, Stream<Path>> listFiles = p -> {
    if (p.toFile().isDirectory()) {
        try { return Files.list(p); }
        catch (Exception e) { return Stream.empty(); }
    } else {
        return Stream.of(p);
    }
};

public static void main(String[] args) throws IOException {
    Path root = Paths.get("C:/temp/");
    Files.list(root).flatMap(listFiles).forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud)

并且使用return Files.list(p).flatMap(listFiles);不编译(不确定为什么)...

注意:我对涉及FileVisitors或外部库的解决方案不感兴趣.

java recursion file java-8 java-stream

20
推荐指数
1
解决办法
7431
查看次数

Java 8中的递归lambda表达式

我只想递归地定义一个Java 8 lambda表达式.

LAMBDA FAQ提到一个只能在(静态)字段初始化定义递归lambda表达式.

但我在IntelliJ中遇到编译器错误(javac只报告没有消息的错误):

java:初始化程序中的自引用

如果我尝试写类似的东西:

static UnaryOperator<Integer> f = i -> i == 0 ? 1 : i * f.apply( i - 1);
Run Code Online (Sandbox Code Playgroud)

要么

UnaryOperator<Integer> f = i -> i == 0 ? 1 : i * f.apply( i - 1);
Run Code Online (Sandbox Code Playgroud)

我发现使其工作的一种方法是使用数组来引用lambda有效地欺骗java编译器:

import java.util.function.UnaryOperator;

public class RecursiveLambdaExample {

    public static void main(String[] args) {

        UnaryOperator<Integer>[] fac = new UnaryOperator[1];
        fac[0] = i -> i == 0 ? 1 : i * fac[0].apply( i - 1); …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

11
推荐指数
1
解决办法
4877
查看次数

递归数字的数字总和(直到数字小于10)只有java 8 lambdas

我只是练习lamdas java 8.我的问题如下

将一个整数中的所有数字求和,直到小于10(表示剩下一位数)并检查其是否为1

样本输入1

100
Run Code Online (Sandbox Code Playgroud)

样本输出1

1 // true because its one
Run Code Online (Sandbox Code Playgroud)

样本输入2

55
Run Code Online (Sandbox Code Playgroud)

样本输出2

1     ie  5+5 = 10 then 1+0 = 1 so true
Run Code Online (Sandbox Code Playgroud)

我写了一个代码

System.out.println(Arrays.asList( String.valueOf(number).split("") ).stream()
                                                                    .map(Integer::valueOf)
                                                                    .mapToInt(i->i)
                                                                    .sum() == 1);
Run Code Online (Sandbox Code Playgroud)

它适用于输入1即100但不适用于输入2,即55,我清楚地理解,在第二种情况下10是输出,因为迭代不是递归的.

那么如何才能使这个lambdas表达式递归,以便它也可以在第二种情况下工作呢?我可以使用该lambda表达式创建一个方法并每次调用它,直到返回值<10,但我在想是否在lambdas中有任何方法.

谢谢

java recursion lambda java-8 java-stream

6
推荐指数
1
解决办法
855
查看次数

标签 统计

java ×3

java-8 ×3

java-stream ×2

lambda ×2

recursion ×2

file ×1