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

理解java中的方法引用[重复]

商同化
2023-03-14

为什么下面的工作?

Stream<String> names = Arrays.stream(fields).map(Field::getName);

当我阅读java.util.stream.stream的方法描述时

共有1个答案

东郭鹤龄
2023-03-14

这是速记。

Field::getName引用Field类中的getName方法。

对于这个方法,将接受两种可能性。很可能它将是一个非静态方法,声明如下

public String getName() {
    return "whatever";
}

然后,它接收其输入流元素(我们称其为f)作为实例,在其上调用getName()方法,类似于调用f.getName()。

但它也可能是一个静态方法,接收输入流元素作为其调用参数:

public static String getName(Field f) {
    return "whatever";
}

然后有效的调用是Field.getName(f)。

(以下文本集中于非静态情况。)

然后,对于流上接收的字段f,字段::getName将输出f的结果。getName(),可以用稍长的“lambda”语法编写为-

但这仍然不容易与函数匹配

new Function<Field,String>() {
    public String apply(Field f) {
        return f.getName();
    }
}

其中most是样板,lambda的右侧进入方法的返回语句。

反过来,这个匿名类表达式是新WhateverClass$12345()的缩写,假设类定义如下

class WhateverClass$12345 implements Function<Field,String> {
    public String apply(Field f) {
        return f.getName();
    }
}

Java虚拟机只知道单个命名类,不支持内部/匿名类和外部类之间的关系。这些特性所需的所有魔法都是由Java编译器完成的。

在后台使用匿名类时,编译器使用合成名称创建类,如WhateverClass$12345,并替换新函数

当查看编译结果(类目录或JAR文件)时,通常会发现许多类似的类,名称以美元符号和数字结尾,每个匿名类表达式对应一个。

 类似资料:
  • 我举了以下例子: 例。1起作用是因为类中的方法具有与接口中的方法相同的方法签名和返回类型。 但为什么Ex.2有效?类中的方法,与Method签名不同,我希望在这里得到编译时错误。

  • 我有一个抛出检查异常的方法: 我正在尝试创建一个通用包装器,它将优雅地处理异常。 现在我正在使用,它给我编译时错误。我可能错过了什么?

  • 问题内容: 这是我对Java中的重载解析的了解: 编译器尝试从给定的重载方法定义中解析方法调用的过程称为重载解析。如果编译器找不到确切的匹配项,则仅通过使用向上转换来查找最接近的匹配(永远不会进行向下转换)。 这是一堂课: 如预期的那样,输出为10。 但是,如果我稍微更改类定义并更改第二个重载方法。 输出为8。 在这里我很困惑。如果从不使用向下转换,那么为什么只打印8个?为何编译器会选择以参数为参

  • 我们可以按以下方式对汽车列表进行排序:, 如果我们看到方法<代码>比较器的签名。比较,输入参数类型为函数 在上面的例子中,如何转换为

  • 本文向大家介绍深入理解Java中的弱引用,包括了深入理解Java中的弱引用的使用技巧和注意事项,需要的朋友参考一下 不久之前,我面试了一些求职Java高级开发工程师的应聘者。我常常会面试他们说,“你能给我介绍一些Java中得弱引用吗?”,如果面试者这样说,“嗯,是不是垃圾回收有关的?”,我就会基本满意了,我并不期待回答是一篇诘究本末的论文描述。 然而事与愿违,我很吃惊的发现,在将近20多个有着平均

  • 主要内容:1.方法引用,2.方法引用与lambda,3.方法引用的使用1.方法引用 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。 方法引用通过方法的名字来指向一个方法。 方法引用可以使语言的构造更紧凑简洁,减少冗余代码。 方法引用使用一对冒号 :: 2.方法引用与lambda 3.方法引用的使用 静态方法引用 静态方法