[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<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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,398评论 19 139
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,826评论 0 9
  • 1.在C/C++中实现本地方法 生成C/C++头文件之后,你就需要写头文件对应的本地方法。注意:所有的本地方法的第...
    JayQiu阅读 7,036评论 0 3
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,930评论 18 399
  • 写在开始 在前面,我们的 TODO 应用都是使用的同步操作。但是,一个应用肯定要有异步操作,例如获取远程数据。这一...
    EyluWang阅读 4,857评论 0 51