使用lambda查找某些扩展名的文件

时间:2017-12-19 18:57:21

标签: java lambda

作为练习,我决定重写我的一些代码以使用lambda表达式。代码应该检查给定字符串是否是具有.pdf扩展名的文件的路径,然后它应该显示满足此要求的所有文件。这就是我已经想到的:

Files.newDirectoryStream(Paths.get(args[0]), path -> path.toFile()
                    .toString()
                    .endsWith(".pdf"))
                    .forEach(System.out::println);

此代码在某一时刻失败:它还显示目录。你能告诉我为什么下面的代码无法编译吗?

Files.newDirectoryStream(Paths.get(args[0]), path -> path.toFile()
                    .isFile()
                    .toString()
                    .endsWith(".pdf"))
                    .forEach(System.out::println);

2 个答案:

答案 0 :(得分:1)

因为编译器希望boolean作为

的第二个参数
newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> filter)

过滤器是一个定义为:

的功能接口
boolean accept(T entry) throws IOException;

但是在这里:

  .isFile()
  .toString()

返回String

通过组合两个布尔表达式来做两次事情:

Files.newDirectoryStream(Paths.get(args[0]), path -> 
                                             Files.isRegularFile(path)
                                             && path.toString().endsWith(".pdf"))
    .forEach(System.out::println);

除了Andreas评论: path.toFile().toString().endsWith(".pdf"))

可以缩写为:path.toString().endsWith(".pdf"),您也可以替换

path.toFile().isFile()的{​​p> Files.isRegularFile(path) 它只允许依赖java.nio.file API,而不是将其与java.io.file API混合使用。

答案 1 :(得分:1)

您的第二个代码无法编译,因为isFile返回boolean。一旦你有boolean,文件名就消失了;即使您可以将其转换为String,将其后缀与".pdf"匹配也会失败。

您正在测试两个不同的条件,因此您应该在两个单独的检查中对它们进行测试:

Files.newDirectoryStream(Paths.get(args[0]), path ->
    Files.isRegularFile(path) &&  path.toString().endsWith(".pdf")
).forEach(System.out::println);

请注意,path.toString().endsWith(...)可以在不将Path转换为File的情况下进行检查。