我想使用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);
}
并且使用return Files.list(p).flatMap(listFiles);不编译(不确定为什么)...
注意:我对涉及FileVisitors或外部库的解决方案不感兴趣.
我只想递归地定义一个Java 8 lambda表达式.
的LAMBDA FAQ提到一个只能在(静态)字段初始化定义递归lambda表达式.
但我在IntelliJ中遇到编译器错误(javac只报告没有消息的错误):
java:初始化程序中的自引用
如果我尝试写类似的东西:
static UnaryOperator<Integer> f = i -> i == 0 ? 1 : i * f.apply( i - 1);
要么
UnaryOperator<Integer> f = i -> i == 0 ? 1 : i * f.apply( i - 1);
我发现使其工作的一种方法是使用数组来引用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); …我只是练习lamdas java 8.我的问题如下
将一个整数中的所有数字求和,直到小于10(表示剩下一位数)并检查其是否为1
样本输入1
100
样本输出1
1 // true because its one
样本输入2
55
样本输出2
1     ie  5+5 = 10 then 1+0 = 1 so true
我写了一个代码
System.out.println(Arrays.asList( String.valueOf(number).split("") ).stream()
                                                                    .map(Integer::valueOf)
                                                                    .mapToInt(i->i)
                                                                    .sum() == 1);
它适用于输入1即100但不适用于输入2,即55,我清楚地理解,在第二种情况下10是输出,因为迭代不是递归的.
那么如何才能使这个lambdas表达式递归,以便它也可以在第二种情况下工作呢?我可以使用该lambda表达式创建一个方法并每次调用它,直到返回值<10,但我在想是否在lambdas中有任何方法.
谢谢