gpt4 book ai didi

java - Java 8 中使用非静态方法的 lambda

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:17:18 24 4
gpt4 key购买 nike

我正在尝试学习新 Java 8 中的 lambda。有一件有趣的事情。如果方法具有与功能接口(interface)相同的签名,则可以使用 lambdas API 将其分配给它。例如。

Comparator<Integer> myComp = Integer::compare;

这个方法(Integer.compare)是静态的,有两个值,一切都很完美。签名与接口(interface)方法比较中的签名相同。但是这可以用非静态方法来实现,例如

Comparator<Integer> myComp = Integer::compareTo.

此方法是非静态的(实例级别),此外,它只需要一个值。据我了解,Java 中没有非静态方法,每个方法都是静态的,但如果未将其标记为静态,则将 this 作为第一个参数。如下

compareTo(this,Integer value).

由于比较对象和整数,假设结果将是未定义的是合理的。但这行得通。

Comparator<Integer> comparator = Integer::compareTo;
Comparator<Integer> comparator2 = Integer::compare;
System.out.println(comparator.compare(1,2));
System.out.println(comparator2.compare(1,2));

这同样有效。我已经调试了调用方法堆栈。在不创建实例的情况下调用比较器对象的比较方法时,this。值已经由第一个参数初始化,当然这是对该对象的有效引用。

所以问题是这是如何工作的?在调用方法时编译器会检查,如果类只有一个字段与方法中的第一个参数具有相同的类型,如果类有编译器隐含地创建具有初始化字段的类的新实例或者它如何工作?

最佳答案

这是因为 lambda 不是来自面向对象的世界。

当您将某些方法分配给 Comparator<Integer> 时它的任务是执行比较。

Comparator<Integer> methodOne = Integer::compare;
Comparator<Integer> methodTwo = Integer::compareTo;

methodOne.compare(1,2);将被翻译成Integer.compare(1,2)称为非实例捕获,引用静态方法

methodTwo.compare(1,2);将被翻译成1.compareTo(2) is 被称为实例捕获,指的是实例方法。

编译器“知道”您引用了哪种类型的方法,因此它可以无误地进行处理。

Method reference capture

关于java - Java 8 中使用非静态方法的 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25784337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com