当前位置: 首页 > 知识库问答 >
问题:

方法引用语法如何在Java8[duplicate]中工作

禄星腾
2023-03-14

我对方法引用在Java8中是如何工作的有些困惑。我编写了下面的代码段用于过滤文件夹中的隐藏文件。他们正在产生正确的结果。我不理解->listFiles方法的方法签名是如何在这个代码段的选项2中工作的。

这是我在Java8文档中发现的

  1. 文件[]listFiles()
  2. 文件[]listFiles(FileFilter筛选器)
  3. 文件[]listFiles(FilenameFilter筛选器)
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]);
}

共有1个答案

沈俊晤
2023-03-14

什么是方法引用

可以将方法引用视为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);
}

文档:

方法引用

文件过滤器

 类似资料:
  • 主要内容:1 Java8 方法引用的介绍,2 Java8 方法引用的分类,3 Java8 方法引用:引用静态方法,4 Java8 方法引用:引用实例方法,5 Java8 方法引用:引用构造方法1 Java8 方法引用的介绍 Java提供了一个新功能,称为Java 8中的方法引用。方法引用用于引用功能接口的方法。它是lambda表达式的紧凑和简单形式。每次使用lambda表达式仅引用方法时,都可以将lambda表达式替换为方法引用。在本教程中,我们将详细解释方法参考概念。 2 Java8 方法引用

  • 本文向大家介绍使用Java8中的方法引用来引用实例方法,包括了使用Java8中的方法引用来引用实例方法的使用技巧和注意事项,需要的朋友参考一下 Java中的Lambda表达式使您可以将功能作为参数传递给方法。您也可以使用lambda表达式调用现有方法。 方法引用是简单,易于阅读的lambda表达式,可通过lambda表达式中的名称来调用/引用和现有方法。 语法 以下是在Java中引用实例方法的语法

  • 问题内容: 两者都是具有相同签名的实例方法。为什么一个起作用而另一个不起作用? 签名: 问题答案: 引用方法有3种构造: 该行: 使用3’rd结构- 。在这种情况下, 第一个参数成为该方法的目标 。此构造等效于(翻译)以下Lambda: 这Lambda表达式工作,因为拉姆达 得到的参数,并返回结果-所要求的接口。 该行: 转换为: 哪个不适用于该界面。您可以更改为: 此更改后将进行编译。

  • 问题内容: 如何使用标签链接到方法? 我想要改变: 至: 但我不知道如何正确设置标签格式。 问题答案: 您可以 在标准Doclet 的 文档注释规范中 找到有关JavaDoc的许多信息,包括有关JavaDoc 的信息。 {@link package.class#member标签} 标签(您要查找的)。文档中的相应示例如下 例如,以下注释引用了getComponentAt(int,int)方法: 如

  • 我正在为Java8证书做准备,下面的内容让我有点困惑,也许有人能帮我?在这个例子中,一个Squirrel类被建模。它有一个名称和一个权重。现在你可以创建一个比较器类来使用这两个字段对它进行排序。所以首先按名称排序,然后按权重排序。类似于这样: 到现在为止,一直都还不错。。但接下来是令人困惑的部分。在代码示例下面,它们声明您可以使用方法链接在一行中编写此代码。也许我误解了,但当我将比较部分和then

  • 如果我使用,但和两个参数等于supplier,它就会运行。 如何使在方法中工作?