这段代码能转化为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();
}发布于 2015-11-06 13:01:52
这可以简单地写成:
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创建匿名类替换为方法参考 Files::isDirectory。这样做是因为:
Files::isDirectory与lambda表达 path -> Files.isDirectory(path)完全相同。Path,并返回一个boolean。boolean accept(Path)接口的唯一方法DirectoryStream.Filter的签名一致。然后,其余代码使用添加到Iterable (Iterable是DirectoryStream )的新方法DirectoryStream。该方法接受一个参数,即Consumer,该参数可以表示为一个lambda表达式,该表达式接受Path类型的单个参数,但不返回任何结果(此参数的参数与上面相同)。
https://stackoverflow.com/questions/33567188
复制相似问题