Method Reference
方法引用就是将一个已实现的方法,直接作为接口中抽象方法的实现(当然前提是方法定义得一样才行)

public interface Study {
  int sum(int a, int b); //待实现的求和方法 
}

那么使用时候,可以直接使用Lambda表达式:

public static void main(String[] args) {
    Study study = (a, b) -> a + b;
}

只不过还能更简单,因为Integer类中默认提供了求两个int值之和的方法:

//Integer类中就已经有对应的实现了
public static int sum(int a, int b) {
    return a + b;
}

此时,我们可以直接将已有方法的实现作为接口的实现:

public static void main(String[] args) {
    Study study = (a, b) -> Integer.sum(a, b);   //直接使用Integer为我们通过好的求和方法
    System.out.println(study.sum(10, 20));
}

我们发现,Integer.sum的参数和返回值,跟我们在Study中定义的完全一样,所以说我们可以直接使用方法引用:

public static void main(String[] args) {
    Study study = Integer::sum;    // 使用双冒号来进行方法引用,静态方法使用 类名::方法名 的形式
    System.out.println(study.sum(10, 20));
}

方法引用其实本质上就相当于将其他方法的实现,直接作为接口中抽象方法的实现。任何方法都可以通过方法引用作为实现:

public interface Study {
    String study();
}

如果是普通从成员方法,我们同样需要使用对象来进行方法引用:

public class Main{
	public static void main(String[] args) {
	    Main main = new Main();
	    Study study = main::lbwnb;   //成员方法因为需要具体对象使用,所以说只能使用 对象::方法名 的形式
	}
	
	public String lbwnb(){
	    return "卡布奇诺今犹在,不见当年倒茶人。";
	}
}

因为现在只需要一个String类型的返回值,由于String的构造方法在创建对象时也会得到一个String类型的结果,所以说:

public static void main(String[] args) {
    Study study = String::new;    //没错,构造方法也可以被引用,使用new表示
}

反正只要是符合接口中方法的定义的,都可以直接进行方法引用,对于Lambda表达式和方法引用,在Java新特性介绍篇视频教程中还有详细的讲解,这里就不多说了。