将DirectoryStream转换为lambda表达式

时间:2015-11-06 12:48:46

标签: java lambda java-8

这段代码可以变成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();
}

1 个答案:

答案 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。这是因为:

然后,其余代码使用添加到forEachDirectoryStream为)的新方法Iterable。此方法采用单个参数Consumer,可以表示为lambda表达式,它采用类型Path的单个参数并且不返回任何结果(此参数与上面相同)。