🫖 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