为什么 File :: isDirectory 在以下示例中作为FileFilter正常工作?
File[] files = new File(".").listFiles(File::isDirectory);
listFiles方法需要FileFilter作为参数
public File[] listFiles(FileFilter filter) {
...
}
FileFilter是一个功能接口,它有一个带有File参数 accept 的方法
boolean accept(File pathname);
File类中的isDirectory方法没有参数
public boolean isDirectory() {
...
}
答案 0 :(得分:6)
为了使事情更清楚,方法引用File::isDirectory
等同于以下lambda:
file -> file.isDirectory()
您可以看到我们正在传递File
参数,然后在其上调用isDirectory
,返回boolean
,从而满足FileFilter
中的SAM {1}}界面。
答案 1 :(得分:2)
因为FileFilter是@FunctionalInterface
。它只有一个方法,它接受一个文件作为参数并返回一个布尔值。
@FunctionalInterface
public interface FileFilter {
/**
* Tests whether or not the specified abstract pathname should be
* included in a pathname list.
*
* @param pathname The abstract pathname to be tested
* @return <code>true</code> if and only if <code>pathname</code>
* should be included
*/
boolean accept(File pathname);
}
如果要扩展此方法引用并使用Anonymous类编写它。它看起来像这样
File[] files = new File(".").listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isDirectory();
}
});
哪个是自我解释的。希望很清楚。