试图理解Java 8中的方法引用(将类方法分配给函数接口)



我正在努力更好地理解方法引用是如何工作的。在这个例子中,我遵循代码的逻辑,但我不理解这样做的价值。基本上,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表达式?让我们参考已经定义的方法并重用它;


四种方法引用:

  1. SomeType::staticMethodName-引用静态方法(您只引用"SomeType"类的静态方法(;

  2. someTypeInstance::instanceMethodName-对特定对象的实例方法的引用(这里,您需要一个实际对象,从中可以获得方法引用(;

  3. SomeType::instanceMethod-引用特定类型的任意对象的实例方法(在这种情况下,您不需要显式创建对象(;

  4. 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)

最新更新