一页书

你永远不会过度准备

方法引用

简介

方法引用使得开发者可以直接引用 现存的方法、Java类的 构造方法 或者 实例对象

方法引用可以使Lambda更精简,使得java类的构造方法看起来紧凑而简洁,没有很多复杂的模板代码。

方法引用的格式

  1. instanceName::methodName 对象::方法名
  2. ClassName::staticMethodName 类名::静态方法
  3. ClassName::methodName 类名::普通方法
  4. ClassName::new 类名::new (调用的构造器)
  5. 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表达式的缩写形式 , 不过要注意的是方法引用只能"引用"已经存在的方法!

0%