为什么File :: isDirectory作为FileFilter工作正常?

时间:2018-06-15 14:11:49

标签: java java-8

为什么 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() {
   ...
}

2 个答案:

答案 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();
      }
});

哪个是自我解释的。希望很清楚。