这段代码可以变成lambda表达式吗?我尝试了很多,但我没有得到它。
DirectoryStream.Filter<Path> dirFilter = new DirectoryStream.Filter<Path>() {
@Override
public boolean accept(Path dir) throws IOException {
return Files.isDirectory(dir);
}
};
Path baseDirectory = getProjectDir();
try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(baseDirectory, dirFilter)) {
for(Path path : dirStream) {
System.out.println(path.getFileName());
}
} catch(IOException ioe) {
ioe.printStackTrace();
}
答案 0 :(得分:7)
这可以简单地写成:
DirectoryStream.Filter<Path> dirFilter = Files::isDirectory;
Path baseDirectory = getProjectDir();
try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(baseDirectory, dirFilter)) {
dirStream.forEach(p -> System.out.println(p.getFileName()));
}
首先,DirectoryStream.Filter
的匿名类的创建将替换为method reference Files::isDirectory
。这是因为:
Files::isDirectory
与lambda expression path -> Files.isDirectory(path)
完全相同。Path
,并返回boolean
。boolean accept(Path)
界面唯一方法DirectoryStream.Filter
的签名。然后,其余代码使用添加到forEach
(DirectoryStream
为)的新方法Iterable
。此方法采用单个参数Consumer
,可以表示为lambda表达式,它采用类型Path
的单个参数并且不返回任何结果(此参数与上面相同)。