function接口的行为和方法参考
当属于变量的方法的引用被破坏时会发生什么?
public class Hey{ public double bar; public Hey(){ bar = 2.0d; } public double square(double num){ return Math.pow(num , bar); } } Function square; whatsGonnaHappen: { Hey hey = new Hey(); square = hey::square; }//is hey still kept around because its method is being referenced? double ans = square.apply(23d);
Scope是一个编译时概念,用于控制源代码中名称的使用位置。 来自JLS
声明的范围是程序的区域,声明中声明的实体可以使用简单的名称引用,只要它是可见的(第6.4.1节)。
名称hey
仅限于whatsGonnaHappen
标记语句的主体这一事实与hey
运行时引用的实例是否是垃圾收集的候选者(我认为是您所担心的)无关。
关于变量捕获,是的,方法引用hey::square
是对特定对象的实例方法的引用(由hey
引用的方法),因此在对方法引用表达式求值时将捕获变量的值hey
生成一个实例并在调用apply
时使用它。
您的方法引用基本上等同于这样做:
Hey hey = new Hey(); Function square = new DoubleDoubleFunction(hey);
DoubleDoubleFunction
类定义如下
class DoubleDoubleFunction implements Function { private final Hey hey; public DoubleDoubleFunction(Hey hey) { this.hey = hey; } @Override public Double apply(Double num) { return hey.square(num); } }
换句话说, square
支持对Hey
的引用。
我不知道eclipse,但是使用IntelliJ,您可以轻松地将方法引用和lambdas转换为匿名/静态嵌套/内部类,以查看正在发生的事情。 我发现这是一件非常有益的事情。