java - 方法引用语法在 Java 8 中是如何工作的
问题描述
我对 Java 8 中方法引用的工作方式有些困惑。我编写了以下代码段来过滤文件夹中的隐藏文件。他们正在产生正确的结果。我不明白 -> listFiles 方法的方法签名如何用于此代码段的选项 2。
这是我在 Java 8 文档中找到的
File[] listFiles()
File[] listFiles(FileFilter filter)
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]);
}
解决方案
什么是方法参考
您可以将方法引用视为 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);
旁注
- 您不需要将
p
. 为了更好的可读性,我建议(p)
用简单的p
. 因此,您的 lambda 表达式将变为p-> p.isHidden()
. - 您的 for 循环可以替换为增强的 for 循环:
for (File value : hidden) {
System.out.println(value);
}
文档:
推荐阅读
- javascript - 使用输入文本和 onclick 按钮的弹出窗口
- python - python(从anaconda安装)无法编译
- r - RShiny 列与图片重叠
- r - 是否可以在 R 中自定义重写 install.packages() 以便不需要在包名称周围指定引号?
- c# - 如何模拟 Azure.Container 以引发异常并且不出错
- c++ - 使用模板调度模板化函数的优雅方式
- java - 如何取回存储在 JCEKS 密钥库中的密码?
- vue.js - 无法在 Vue.js 中加载字体
- google-colaboratory - NotFoundError:iris_training.csv
- java - 输入 Java 检查整数中的错误