【问题标题】:Getting only file names from the folder in Java8 with Filtering使用过滤从Java8中的文件夹中获取文件名
【发布时间】:2023-03-28 10:55:02
【问题描述】:

我想仅列出 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());

【问题讨论】:

  • Path API 真的很烦人,不仅像 getFileName() 这样的方法返回 Path 而不是名称 String,而且还提供像 endsWith(String) 这样的方法,其语义完全不同比String.endsWith(String)。我不知道,我偶然发现它的频率。要点是,更改您的代码 as suggested by this answer 或使用 file.getFileName().toString().endsWith(".txt") 并记住此示例,说明当您必须设计 API 时如何不这样做。

标签: java lambda collections java-8


【解决方案1】:

为此,请使用以下代码行:

Files.list(configFilePath)
    .filter(s -> s.toString().endsWith(".txt"))
    .forEach(System.out::println);

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

【讨论】:

  • 您的答案将受益于对 OP 原始代码差异的小解释(即出了什么问题)......
  • 我的意思是 OP 使用了 getFileName(),它返回了一个 Path,而 endsWith 方法没有做预期的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
相关资源
最近更新 更多