JAVA8新特性--方法引用

原创 2018年04月15日 22:38:23

方法引用是什么?
w3c教程上这样解释:方法引用通过方法的名字来指向一个方法。反正这句话我是看不明白啥意思,结合下面的要介绍的例子我认为这样解释更通俗易懂(了解方法引用前,建议先了解下Lambda表达式,请戳:Lambda表达式):方法引用就是一个特殊的Lambda表达式,如果某个方法和Lambda表达式的内容一样,那么就可以将这个Lambda替换成方法引用的形式
方法引用的四种形式:

  • 构造器引用:它的语法是Class::new,或者更一般的Class< T >::new
  • 静态方法引用:语法是Class::static_method
  • 特定类的任意实例的方法引用:它的语法是Class::method
  • 特定实例的方法引用:它的语法是instance::method

    下面详细介绍四种形式,先引入例子:

class Car {

    //创建车
    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());
    }
}
  • 构造器引用
final Car car = Car.create( Car::new );

我们看下使用Lambda表达式的写法:

final Car car = Car.create( ()->new Car());

再看下在JAVA7中的写法:

final Car car = Car.create(new Supplier<Car>() {
    @Override
    public Car get() {
        return new Car();
    }
});

这样是不是明白了呢,工厂方法create需要一个匿名内部类作为参数,里面的get()方法每次调用产生一个实例,Lambda表达式就是这个匿名内部类的简写形式,而构造器引用则是Lambda表达式的简写形式

//先创建一个集合
final List< Car > cars = Arrays.asList( car );

cars.forEach( Car::collide );

我们看下Lambda写法:

cars.forEach((o)->Car.collide(o));

再看下java7中的写法:

for (Car o : cars) {
    Car.collide(o);
}

在JAVA7中遍历cars并将其中的对象传递给静态方法collide,JAVA8中的集合遍历forEach隐含了一个car对象,所以Lambda中也是使用了一个参数,静态方法引用所对应的方法collide也是只有一个car对象,也就是说,静态方法引用的使用必须保证和其引用的静态方法的参数个数一致。

  • 特定类的任意实例的方法引用
cars.forEach( Car::repair );

Lambda写法:

cars.forEach((o)->o.repair());

JAVA7中写法:

for (Car o : cars) {
    o.repair();
}

通过JAVA7的写法能看到特定类的任意实例的方法引用的解释:使用的是Car类的实例o的repair方法的引用。

  • 特定实例的方法引用
//创建个实例
final Car police = Car.create( Car::new );

cars.forEach( police::follow );

Lambda写法:

cars.forEach((o)->police.follow(o));

JAVA7中写法:

for (Car o : cars) {
    police.follow(o);
}

通过JAVA7的写法也能看到对 特定实例的方法引用的解释:使用的是一直是Car类的police实例的方法follow。


后两种方法引用开始实在有点难以理解,但是通过结合JAVA7中的写法,很容易就想明白了。
总结(使用场景):
构造器引用:是对匿名内部类的使用的一种简写形式。
静态方法引用:就是对静态方法的引用简写形式。
特定类的任意实例的方法引用:就是使用指定类任意一个实例的方法的简写形式。
特定实例的方法引用:就是使用指定类指定实例的方法的简写形式。

STL中的list::sort算法解析

References 《STL源码剖析》http://www.ecjtu.org/thread-30140-1-1.html 《算法导论》http://blog.yangzhe1991.o...
  • airekans
  • airekans
  • 2011-12-30 08:52:59
  • 546

方法的引用-java8新特性

1. 什么是方法引用?     方法引用是java8 新增的一种引用类型,java8之前,只有对象引用和java基本类型的引用。说的简单一点就是增加了一种引用类型,和java8之前的对象引用实质...
  • jinshiyill
  • jinshiyill
  • 2016-03-07 13:18:05
  • 2085

Java8新特性整理之方法引用(二)

方法引用语法 目标引用 ::方法的名称 例子 截取字符串的Lambda表达式 (str, i) -> str.substring(i) 等效的方法引用 String::s...
  • u011726984
  • u011726984
  • 2018-02-06 10:09:37
  • 55

Android 使用Java8新特性之"方法引用"

前言 上一文:Android 使用Java8新特性之Lambda expression (附命令者模式简化) 说过lambda表达式,在android中的应用。本文讲下Java8新特性之”方法引用...
  • jjwwmlp456
  • jjwwmlp456
  • 2017-03-13 18:10:46
  • 1863

java8新特性之四--方法引用

直接上例子:import java.util.ArrayList;import java.util.function.Supplier;class Instance { public static I...
  • xuqiaobo
  • xuqiaobo
  • 2018-04-03 20:11:05
  • 9

详解Java8特性之方法引用

前言在详解Java8特性之Lambda表达式 中我介绍了Java8中的Lambda表达式,通过Lambda表达式我们就可以快速地创建一个函数式接口的实例,可以说是大大简便了我们开发。你以为只能做到这么...
  • TimHeath
  • TimHeath
  • 2017-05-05 12:49:15
  • 1333

JAVA8之方法引用和构造引用

其实关于方法引用和构造引用大家可以简单理解为lambda的简写形式 一.方法引用 方法引用分为三类: 1.指向静态方法的方法引用 例子: public static void main(St...
  • zhang89xiao
  • zhang89xiao
  • 2016-07-13 18:08:01
  • 2318

java8系列之方法引用

概述在java 8中,我们习惯于使用Lambda表达式,来表示函数接口得引用。有时候在函数接口中,调用的是已经存在的方法。在这种情况下,java8提供了一个简写语法,那就是方法引用,进一步简化Lamb...
  • IO_Field
  • IO_Field
  • 2017-02-13 10:37:40
  • 1146

java8新特性

  • 2018年01月23日 09:53
  • 28.73MB
  • 下载

Java8新特性--方法引用

Java 8中方法也是一种对象,可以By名字来引用。不过方法引用的唯一用途是支持Lambda的简写,使用方法名称来表示Lambda。不能通过方法引用来获得诸如方法签名的相关信息。 方法引用的分类 方...
  • u010002184
  • u010002184
  • 2017-07-09 00:00:27
  • 133
收藏助手
不良信息举报
您举报文章:JAVA8新特性--方法引用
举报原因:
原因补充:

(最多只允许输入30个字)