使用Java8过滤文件夹只获取文件名

4

我希望在Java 8中列出仅以.txt扩展名结尾的文件名。

使用这段代码,我获取了所有文件名称,其中许多具有.txt扩展名:

List<Path> fileNames = Files.list(configFilePath)
                .map(Path::getFileName)
                .sorted()
                .collect(toList());

但是使用这段代码,我得到了一个空值:
List<Path> fileNames = Files.list(configFilePath)
                filter(file -> file.getFileName().endsWith(".txt"))
                .map(Path::getFileName)
                .sorted()
                .collect(toList());

5
Path API非常令人烦恼,不仅有像getFileName()这样返回Path而不是名称String的方法,还提供了像endsWith(String)这样语义与String.endsWith(String)完全不同的方法。我不知道我有多少次被绊倒了。要点是,按照此答案建议更改您的代码或使用file.getFileName().toString().endsWith(".txt"),并将其视为设计API时应避免的错误示例。 - Holger
1个回答

9
为了实现这一点,请使用以下代码行:
Files.list(configFilePath)
    .filter(s -> s.toString().endsWith(".txt"))
    .forEach(System.out::println);

您的任务是从文件夹中获取仅以.txt结尾的文件名。所以最简单的方法是使用filter方法,该方法以谓词作为参数。使用谓词意味着保留满足给定条件的所有元素。因为您有一个Path对象的List,我们首先需要将这些对象转换为字符串,并检查是否以.txt结尾。最后,我们只需打印结果即可。

4
您的回答如果附带一些关于原始代码差异的小解释会更有帮助(即出了什么问题)... - Holger
3
我也是指OP使用了getFileName(),它返回一个Path对象,其中包含一个endsWith方法,但并没有执行预期的操作。 - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接