0x00为什么要有方法引用
在使用Lambada 表达式的时候,
(params) -> { statements }
中的statement很多时候就是对一个方法的调用,在这种情况下,直接调用这个方法会使得代码更简洁。
0x01示例
假设有如下一个类
import java.util.function.Supplier;
/**
* Created by haicheng.lhc on 17/04/2017.
*
* @author haicheng.lhc
* @date 2017/04/17
*/
public class Car {
Integer weight;
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());
}
public static int compareByWeight(Car a, Car b) {
return a.weight.compareTo(b.weight);
}
public int compareByWeight1(Car a, Car b) {
return a.weight.compareTo(b.weight);
}
}
现在有一个存储Car的数组
Car car1 = Car.create( Car::new );
car1.weight = 900;
Car car2 = Car.create(Car::new);
car2.weight = 700;
List< Car > cars = Arrays.asList( car1, car2 );
Car[] carArray = ( Car[] )cars.toArray();
需要对其进行排序,按照使用Lambada表达式的方法
Arrays.sort(carArray, (a,b) -> Car.compareByWeight(a,b));
根据我们之前的理解,这个Lambada表达式就是调用了一个方法,可以通过使用
方法引用
的方式来实现
Arrays.sort(carArray, Car::compareByWeight);
0x02四种方法引用
构造器引用(Reference to a constructor)
语法是
Class::new
,或者更一般的形式:Class<T>::new
。注意:这个构造器没有参数。
Car car1 = Car.create( Car::new );
静态方法引用(Reference to a static method)
语法是
Class::static_method
。注意:这个方法接受Car类型的参数。
Arrays.sort(carArray, Car::compareByWeight);
某个类的成员方法的引用(Reference to an instance method of a particular object)
cars.forEach( Car::repair );
某个对象的方法的引用
Arrays.sort(carArray, car1::compareByWeight1);