1、什么是方法引用
方法引用是一种简写lambda表达式的方式。等同于lambda表达式
如:
List<String> stringsArray = Arrays.asList("sdf","gsdf","gsdf"); Collections.sort(stringsArray, (a,b)-> a.compareToIgnoreCase(b));
可简写为:
List<String> stringsArray = Arrays.asList("sdf","gsdf","gsdf"); Collections.sort(stringsArray, String::compareToIgnoreCase);
这就是方法引用 Java8特性。用::表示
2、什么情况下使用
当我们使用lamdba表达式,如果lamdba表达式实现体只调用了一个外部已经存在的方法时。
这种情况 就可以使用方法引用。
如上的例子 lamdba体中只调用了String的compareToIgnoreCase一个方法,就可以使用方法引用
3、分类
静态方法引用、实例方法引用、类型的实例方法引用、构造方法引用、数组构造方法引用
静态方法引用:

class Zoo{ private int age; public Zoo(int age) { this.age = age; } public static int compareZoo(Zoo zoo1, Zoo zoo2){ return zoo1.age - zoo2.age; } } public class LamdbaYf { public static void main(String[] args){ List<Zoo> zooArray = Arrays.asList(new Zoo(3),new Zoo(2)); Collections.sort(zooArray, (zoo1,zoo2) -> Zoo.compareZoo(zoo1,zoo2)); } }
如上使用lamdba方式,改为方法引用:
Collections.sort(zooArray, Zoo::compareZoo);
实例方法引用:
例子:

class Zoo{ private int age; public Zoo(int age) { this.age = age; } public int compareZoo(Zoo zoo1, Zoo zoo2){ return zoo1.age - zoo2.age; } } public class LamdbaYf { public static void main(String[] args){ List<Zoo> zooArray = Arrays.asList(new Zoo(3),new Zoo(2)); Zoo zooInstance = new Zoo(4); Collections.sort(zooArray, zooInstance::compareZoo); } }
类型的实例方法引用:
这点写法跟静态方法引用一样,但实际上调用的方法非static
例子:

public class LamdbaYf { public static void main(String[] args){ List<String> strArray = Arrays.asList("aa","cc","bb"); Collections.sort(strArray, String::compareTo); } }
相当于lamdba表达式调用时,把第一个参数,作为实例再调用方法:

public class LamdbaYf { public static void main(String[] args){ List<String> strArray = Arrays.asList("aa","cc","bb"); Collections.sort(strArray, (a,b)->a.compareTo(b)); } }
有点绕,幸运的是 IDEA会自动帮我们检测,自动帮调整为 "类型的实例方法引用"
构造方法引用:
例子:

class Zoo{ private int age=4; public int getAge() { return age; } } interface ZooCreate{ Zoo create(); } public class LamdbaYf { public static void testZoo(ZooCreate zooCreate){ Zoo zoo = zooCreate.create(); System.out.println("age="+zoo.getAge()); } public static void main(String[] args){ testZoo(Zoo::new); } }
数组构造方法引用:
例子:

package com.yangfei.test.lamdba; class Zoo{ private int age=4; public int getAge() { return age; } } interface ZooCreate{ Zoo[] create(int num); } public class LamdbaYf { public static void testZoo(ZooCreate zooCreate){ Zoo[] zoo = zooCreate.create(5); System.out.println("age="+zoo[0].getAge()); } public static void main(String[] args){ ZooCreate zooCreate = Zoo[]::new; testZoo(zooCreate); } }