简介
方法引用使得开发者可以直接引用 现存的方法、Java类的 构造方法 或者 实例对象。
方法引用可以使Lambda更精简,使得java类的构造方法看起来紧凑而简洁,没有很多复杂的模板代码。
方法引用的格式
instanceName::methodName
对象::方法名ClassName::staticMethodName
类名::静态方法ClassName::methodName
类名::普通方法ClassName::new
类名::new (调用的构造器)TypeName[]::new
String[]::new (调用数组的构造器)
符号说明 : 双冒号(::
)为方法引用运算符,而它所在的表达式被称为方法引用。
应用场景 : 如果Lambda所要实现的方案 , 已经有其他方法存在相同方案,那么则可以使用方法引用。
假设有一个Car对象,里面有四个不同功能的方法,如下
public class Car {
// 返回一个Car对象的静态方法
public static Car create(Supplier<Car> supplier) {
return supplier.get();
}
// 输出Car对象的静态方法
public static void test1(Car car) {
System.out.println("test1 " + car.toString());
}
// 输出Car对象的普通方法(有参)
public void test2(Car car) {
System.out.println("test2 " + car.toString());
}
// 输出Car对象的普通方法(无参)
public void test3() {
System.out.println("test3 " + this.toString());
}
}
方法引用代替lambda示例
public class CarTest {
public static void main(String[] args) {
// 调用Car.create创建Car示例 使用普通Lambda表达式
Car car01 = Car.create(() -> new Car());
// 调用Car.create创建Car示例 使用方法引用(类名::new)
Car car02 = Car.create(Car::new);
// 创建一个集合
List<Car> cars = Collections.singletonList(car02);
// 遍历集合-使用普通Lambda表达式
cars.forEach(e -> System.out.println("test0 " + e.toString()));
// 遍历集合-使用方法引用(类名::静态方法)test1有参数
cars.forEach(Car::test1);
// 遍历集合-使用方法引用(类名::普通方法)test3无参数
cars.forEach(Car::test3);
// 遍历集合-使用方法引用(对象::方法名)test2有参数
cars.forEach(car02::test2);
}
}
运行上述例子,可以在控制台看到如下输出:
test0 com.log.y22m7.d3.Car@214c265e
test1 com.log.y22m7.d3.Car@214c265e
test3 com.log.y22m7.d3.Car@214c265e
test2 com.log.y22m7.d3.Car@214c265e
总结
方法引用是对Lambda表达式符合特定情况下的一种缩写,它使得我们的Lambda表达式更加的精简,也可以理解为
Lambda表达式的缩写形式 , 不过要注意的是方法引用只能"引用"已经存在的方法!