使用 Java 8 和 java.nio 包。 Files.walk()
Java 8 方法将列出所有文件和目录。有没有办法统计文件和目录的数量。
我有一个使用 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();
}
}
但是我也想计算文件/目录并尝试过
{
int dirCount = 0;
Stream<Path> files = Files.walk(Paths.get("C:\\temp"));
files.forEach(System.out::println);
files.forEach(dirCount++);
files.close();
}
但是 java 类无法编译
error: incompatible types: int cannot be converted to Consumer files.forEach(dirCount++);
最佳答案
TLDR
long dirCount = files.peek(System.out::println).count();
<小时/>
forEach
方法需要一个 Consumer
作为参数:
void forEach(Consumer<? super T> action);
如果消费者签订了以下契约(Contract):
public interface Consumer<T> {
void accept(T t);
...
}
因此,为了满足 Consumer
的契约,您必须提供一个采用 T t
参数的方法。
在第一个示例中,您使用方法引用:
files.forEach(System.out::println);
System.out::println
能够满足定义为的契约:
void println(Object obj);
在第二个示例中,您没有提供满足参数的表达式,它只是一个语句。您可能会想“好吧,我将使用满足契约的 lambda 来执行此操作”,但这也会有错误:
files.forEach(file -> dirCount++);
// Fails to compile because dirCount is not final
对于要在外部作用域的 lambda 内部使用的对象,它必须是最终的,这意味着您无法更改变量指向的引用或原始值。另一个问题是您只能迭代流一次。一旦你迭代它,它就会是空的。
因此,考虑到这个问题,我将使用 peek
和 count
来解决这个问题。当每个项目通过流并将值发送到下一个运算符时,您可以使用 peek
执行操作。之后 count
将评估流中有多少项(消耗流来执行此操作):
long dirCount = files.peek(System.out::println).count();
关于Java.nio Files.walk() Java 8 列出并统计所有文件和目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57618422/