Java.nio Files.walk()Java 8列出并统计所有文件和目录

Java.nio Files.walk()Java 8列出并统计所有文件和目录,java,foreach,stream,Java,Foreach,Stream,在Java.nio包中使用Java8Files.walk()Java8方法将列出所有文件和目录。有没有办法计算文件和目录的数量 我有一个使用File和isDirectory()的解决方案,但我想尝试使用Files.walk获得相同的结果 这个样品运行良好 import java.io.IOException; import java.nio.file.*; import java.util.stream.Stream; public class Java8ListFilesInDirector

在Java.nio包中使用Java8
Files.walk()
Java8方法将列出所有文件和目录。有没有办法计算文件和目录的数量

我有一个使用File和isDirectory()的解决方案,但我想尝试使用Files.walk获得相同的结果

这个样品运行良好

import java.io.IOException;
import java.nio.file.*;
import java.util.stream.Stream;

public class Java8ListFilesInDirectory 
{
    public static void main(String[] args) throws IOException
    {
        Stream<Path> files = Files.walk(Paths.get("C:\\temp"));   
        files.forEach(System.out::println);
        files.close();
    }
}
import java.io.IOException;
导入java.nio.file.*;
导入java.util.stream.stream;
公共类Java8ListFilesInDirectory
{
公共静态void main(字符串[]args)引发IOException
{
流文件=文件.walk(路径.get(“C:\\temp”);
files.forEach(System.out::println);
close();
}
}
但是,我也要计算文件/目录,并且已经尝试过了

    { 
        int dirCount = 0;
        Stream<Path> files = Files.walk(Paths.get("C:\\temp"));   
        files.forEach(System.out::println);
        files.forEach(dirCount++);
        files.close();
    }
{
int dirCount=0;
流文件=文件.walk(路径.get(“C:\\temp”);
files.forEach(System.out::println);
forEach(dirCount++);
close();
}
但是java类无法使用

错误:不兼容的类型:int无法转换为使用者文件

TLDR

long dirCount = files.peek(System.out::println).count();
long dirCount = files.peek(System.out::println).count();

forEach
方法需要一个
Consumer
作为其参数:

void forEach(Consumer<? super T> action);
System.out::println
能够满足合同要求,定义如下:

void println(Object obj);
在第二个示例中,您没有提供能够满足参数的表达式,它只是一个语句。您可能会想“好吧,我将使用满足合同要求的lambda来执行此操作”,但这也会有错误:

files.forEach(file -> dirCount++);
// Fails to compile because dirCount is not final
对于要从外部作用域在lambda内部使用的对象,它必须是final,这意味着您不能更改变量指向的引用或原语值。另一个问题是,您只能在流中迭代一次。只要您遍历它,它就会是空的

鉴于这个问题,我将使用
peek
count
来解决这个问题。您可以使用
peek
在每个项目通过流并将值发送给下一个操作员时执行操作。在此之后,
count
将评估流中有多少项(使用流执行此操作):

files.forEach(file -> dirCount++);
// Fails to compile because dirCount is not final
long dirCount = files.peek(System.out::println).count();