方法引用不是lambda表达式,尽管它们可以以相同的方式使用。我认为这是造成混乱的原因。下面是一个简化的Java如何工作,它不是如何真正的工作,但它是足够接近。
假设我们有一个lambda表达式:
Runnable f = () -> one.bar();
这相当于实现Runnable的一个匿名类:
Runnable f = new Runnable() {
public void run() {
one.bar();
}
}
这里同样的规则适用于匿名类(或方法本地类)。这意味着,人们需要有效地决定它工作。
另一方面方法句柄:
Runnable f = one::bar;
更喜欢:
Runnable f = new MethodHandle(one, one.getClass().getMethod("bar"));
使用MethodHandle:
public class MethodHandle implements Runnable {
private final Object object;
private final Method method;
public MethodHandle(Object object, java.lang.reflect.Method method) {
this.object = Object;
this.method = method;
}
@Override
public void run() {
method.invoke(object);
}
}
在这种情况下,分配给一个对象的对象将作为创建的方法句柄的一部分进行分配,因此一个对象本身不需要有效地最终实现。