我正在努力更好地理解方法引用是如何工作的。在这个例子中,我遵循代码的逻辑,但我不理解这样做的价值。基本上,someMethod((在STEP2中的方法引用赋值之后用作MyInterface的display((抽象方法的实现。但为什么呢?我们这样做有什么收获?这在建筑上什么时候有意义?似乎我们采用了与类无关的接口,并将它们与此作业关联起来。
@FunctionalInterface
interface MyInterface {
void display();
}
class DerivClass {
public void someMethod(){
System.out.println("Derived class method");
}
}
public class RefTest {
public static void main(String[] args) {
DerivClass dc = new DerivClass(); // STEP1: class instance
MyInterface myInterf = dc::someMethod; // STEP 2: assign method ref to interface
myInterf.display(); // STEP 3: executes someMethod(), prints "Derived class method"
}
}
开始理解方法参考的好地方是Oracle文档,它说:
您使用lambda表达式来创建匿名方法。然而,有时lambda表达式除了调用现有方法之外什么也不做。在这些情况下,通过名称引用现有方法通常更清楚。方法引用使您能够做到这一点;对于已经有名称的方法,它们是紧凑的、易于阅读的lambda表达式。
这样想:
">方法定义(特定主体、签名和返回类型(存在;如果我可以重用现有代码,为什么要创建一个新的lambda表达式?让我们参考已经定义的方法并重用它;
四种方法引用:
-
SomeType::staticMethodName
-引用静态方法(您只引用"SomeType"类的静态方法(; -
someTypeInstance::instanceMethodName
-对特定对象的实例方法的引用(这里,您需要一个实际对象,从中可以获得方法引用(; -
SomeType::instanceMethod
-引用特定类型的任意对象的实例方法(在这种情况下,您不需要显式创建对象(; -
SomeType::new
-对构造函数的引用(您可以简单地引用构造函数(。
(2(特定对象的方法引用和(3(任意对象的方法参考之间的差异:
在前两个示例中,方法引用等效于lambda表达式,提供方法的参数。例如:
System.out::println == x -> System.out.println(x);
Math::pow == (x, y) -> Math.pow(x, y)
在第三种情况下,第一个参数成为方法的目标,如
String::compareToIgnoreCase == (x, y) -> x.compareToIgnoreCase(y)