作为练习,我决定重写我的一些代码以使用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);
答案 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
的情况下进行检查。