一、介绍
我们用Lambda表达式来实现匿名方法。但有些情况下,我们用Lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作,在这种情况下,我们倾向于通过方法名来调用它,而Lambda表达式可以帮助我们实现这一要求,它使得Lambda在调用那些已经拥有方法名的方法的代码更简洁、更容易理解。
方法引用可以理解为Lambda表达式的另外一种表现形式。方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
- 方法引用通过方法的名字来指向一个方法。
- 方法引用使用一对冒号 :: 。
- 方法归属者::方法名
eg:1、遍历List,我们只get一次Age属性。2、遍历打印Person数组
// lambda写法
personList.forEach( p -> p.getAge());
//方法引用写法
personList.forEach(Person::getAge);
// lambda写法
Arrays.stream(array).forEach(p-> System.out.println(p));
// 方法引用写法
Arrays.stream(array).forEach(System.out::println);
二、四种方法引用类型
类型 | 语法 | 对应的Lambda表达式 | 举例 |
有参静态方法的 方法引用 | Class::staticMethod | (t) -> 类名.staticMethod(t) | carList.forEach(Car::stop); |
特定类的任意对象的方法引用 | Class::method | (inst,arg) -> inst.method(arg) | carList.forEach(Car::run); |
特定对象的 方法引用 | instance::instMethod | () -> obj.method() | FixFactory fixF=new FixFactory(); carList.forEach(fixF::fix) |
构造器的 方法引用 | Class::new | (args) -> new 类名(args) | Supplier<Car> su =()->new Car(); Car car = su.get(); Supplier<Car> su = Car::new; Car car = su.get(); |
三、代码详细示例
@Data
public class Car {
private String name;
public Car() {
}
public Car(String name) {
this.name = name;
}
public void run(){
System.out.println("跑跑");
}
public static void stop(Car car){
System.out.println(car.getName()+"停车");
}
}
public class CarFixFactory {
public void fix(Car car) {
System.out.println(car.getName() + "汽车正在修理。。。");
}
}
test