首页 > 解决方案 > 方法引用语法在 Java 8 中是如何工作的

问题描述

我对 Java 8 中方法引用的工作方式有些困惑。我编写了以下代码段来过滤文件夹中的隐藏文件。他们正在产生正确的结果。我不明白 -> listFiles 方法的方法签名如何用于此代码段的选项 2。

这是我在 Java 8 文档中找到的

  1. File[] listFiles()
  2. File[] listFiles(FileFilter filter)
  3. File[] listFiles(FilenameFilter filter)
File[] hidden = f.listFiles((p)-> p.isHidden()); //Option 1 - function signature matching (based on my understanding)
for (int i = 0; i < hidden.length; i++) {
    System.out.println(hidden[i]);
}
System.out.println("================================");
File[] hidden1 = f.listFiles(File::isHidden); //Option 2 - how this method call is working
for (int i = 0; i < hidden1.length; i++) {
    System.out.println(hidden1[i]);
}

标签: javaalgorithmjava-8

解决方案


什么是方法参考

您可以将方法引用视为 lambda 表达式,它调用现有方法。

方法参考的种类

有四种方法引用:

  • 引用静态方法:ContainingClass::staticMethodName
  • 引用特定对象的实例方法:containingObject::instanceMethodName
  • 引用特定类型的任意对象的实例方法:ContainingType::methodName
  • 对构造函数的引用:ClassName::new

怎么理解?

以下表达式列出了所有隐藏文件: f.listFiles(p -> p.isHidden());

此表达式由实例方法listFiles(FileFilter)和您的 lambda 表达式组成,p -> p.isHidden()该表达式不是匿名方法,而是该类的现有实例方法File

请注意,这FileFilter是一个函数式接口,因此可以用作 lambda 表达式或方法引用的赋值目标。因此,你可以写下你的表达f.listFiles(File::isHidden);

旁注

  1. 您不需要将p. 为了更好的可读性,我建议(p)用简单的p. 因此,您的 lambda 表达式将变为p-> p.isHidden().
  2. 您的 for 循环可以替换为增强的 for 循环:
for (File value : hidden) {
   System.out.println(value);
}

文档:

方法参考

文件过滤器


推荐阅读