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

标签 java foreach stream

使用 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 内部使用的对象,它必须是最终的,这意味着您无法更改变量指向的引用或原始值。另一个问题是您只能迭代流一次。一旦你迭代它,它就会是空的。

因此,考虑到这个问题,我将使用 peekcount 来解决这个问题。当每个项目通过流并将值发送到下一个运算符时,您可以使用 peek 执行操作。之后 count 将评估流中有多少项(消耗流来执行此操作):

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

关于Java.nio Files.walk() Java 8 列出并统计所有文件和目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57618422/

相关文章:

javascript - Javascript 增强 for...in 循环中的奇怪行为

c++ - 在 GCC 4.7.2 和 Clang 3.2 中显然缺少 getline() 的重载,将 RRef 流式传输

java - 为什么使用增强的 for 循环来实现冒泡排序会给我 ArrayIndexOutOfBoundsException?

java - Android SDK 管理器 Java "Loading Sources"OS X 上的异常

javascript - 当 ForEach 循环中的每个异步函数都已处理完毕时返回 Promise 结尾 [Javascript/Typescript]

java - Java 重新编译期间 "For Statement"中的不兼容类型

java - 计算下载速度

Android MediaPlayer - 如何在 STREAM_ALARM 中播放?

java - 我可以初始化一个静态成员并跨线程共享吗?

java - Spring 3.2.9;瓷砖2.0.7;调用init方法失败;嵌套异常是 java.lang.IllegalArgumentException : No DataSource specified