[Java8]方法引用(Method References)

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 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四种方法引用

[Java8]方法引用(Method References)_第1张图片

构造器引用(Reference to a constructor)

语法是Class::new,或者更一般的形式:Class::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);

你可能感兴趣的:([Java8]方法引用(Method References))