方法引用使得开发者可以直接引用现存的方法、Java类的构造方法或者实例对象。方法引用和Lambda表达式配合使用,使得java类的构造方法看起来紧凑而简洁,没有很多复杂的模板代码。方法引用时对Lambda表达式符合特定情况下的一种缩写方式,它使得Lambda表达式更加精简,可以理解为Lambda表达式的缩写,不过只能引用已经存在的方法。方法引用一般存在下面介绍的五种。
实例对象 :: 方法名
public static void main(String[] args) {Date date = new Date();//普通的Lambda表达式Supplier<Long> supplier1 = () -> {return date.getTime();};System.out.println(supplier1.get());//使用方法引用的Lambda表达式Supplier<Long> supplier2 = date::getTime;System.out.println(supplier2.get());}
类名 :: 静态方法名
public static void main(String[] args) {//普通的Lambda表达式Supplier<Long> supplier1 = () -> {//currentTimeMillis为静态方法return System.currentTimeMillis();};System.out.println(supplier1.get());//使用方法引用的Lambda表达式Supplier<Long> supplier2 = System::currentTimeMillis;System.out.println(supplier2.get());}
类名 :: 引用实例方法
在Java的面向对象中,类名只能调用静态方法,类名引用实例方法是有前提的,实际上是用第一个参数作为方法的调用者。如:
public static void main(String[] args) {//普通的Lambda表达式Function<String, Integer> function1 = (s) -> {return s.length();};System.out.println(function1.apply("Hello World"));//使用方法引用的Lambda表达式Function<String, Integer> function2 = String::length;System.out.println(function2.apply("are you ok? 666"));}
类名 :: new
这是调用了类的构造器,如:
public static void main(String[] args) {//普通的Lambda表达式Supplier<Person> supplier1 = () -> {return new Person();};System.out.println(supplier1.get());//使用方法引用的Lambda表达式Supplier<Person> supplier2 = Person::new;System.out.println(supplier2.get());}

如果同时要给Person,可以使用其它更多参数的函数式接口。
数组 :: new
public static void main(String[] args) {//普通的Lambda表达式Function<Integer, String[]> function1 = (len) -> {return new String[len];};System.out.println(function1.apply(3));//使用方法引用的Lambda表达式Function<Integer, String[]> function2 = String[]::new;System.out.println(function2.apply(4));}

