Java8 新特性 - 方法引用

🫖 Java8 新特性 - 方法引用


概念

方法引用使用一对冒号::,通过方法的名字来指向一个方法。

方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

引用类型

下面,我们在Car类中定义了 4 个方法作为例子来区分 Java 中 4 种不同方法的引用。

/**
 * @Description Car
 * @Author vchicken
 * @Date 2022/9/24 15:35
 */
public class Car {

    /**
     * Supplier是jdk1.8的接口,这里和lamda一起使用了
     *
     * @param supplier
     * @return
     */
    public static Car create(final Supplier<Car> supplier) {
        return supplier.get();
    }

    public static void collide(final Car car) {
        System.out.println("Collided " + car.toString());
    }

    public void follow(final Car another) {
        System.out.println("Following the " + another.toString());
    }

    public void repair() {
        System.out.println("Repaired " + this.toString());
    }
} 

1、构造器引用

它的语法是Class::new,或者更一般的Class< T >::new,实例如下:

final Car car = Car.create( Car::new ); 
final List< Car > cars = Arrays.asList( car ); 

2、静态方法引用

它的语法是Class::static_method,实例如下:

cars.forEach( Car::collide ); 

3、类的成员方法引用

它的语法是Class::method,实例如下:

cars.forEach( car::follow ); 
cars.forEach( Car::repair ); 

4、实例对象的成员方法的引用

它的语法是instance::method,实例如下

final Car police = Car.create( Car::new ); 
cars.forEach( police::follow ); 

注意:这个方法接受一个Car类型的参数!

运行上述例子,可以在控制台看到如下输出:

 public static void main(String[] args) {

        final Car car = Car.create( Car::new );
        final List< Car > cars = Arrays.asList( car );

        cars.forEach( Car::collide );

        cars.forEach( car::follow );
        cars.forEach( Car::repair );

        final Car police = Car.create( Car::new );
        cars.forEach( police::follow );
}

// 执行结果
Collided com.vchicken.java.java8.Car@682a0b20
Following the com.vchicken.java.java8.Car@682a0b20
Repaired com.vchicken.java.java8.Car@682a0b20
Following the com.vchicken.java.java8.Car@682a0b20

参考资料

posted @ 2022-11-10 17:57  初出茅庐小菜鸡  阅读(96)  评论(0编辑  收藏  举报