Java8 方法引用,构造器引用
Lambda 表达式是可以简化函数式接口的变量或形参赋值的语法。
而方法引用和构造器引用是为了简化 Lambda 表达式的。
方法引用可以看做是 Lambda 表达式深层次的表达。换句话说,方法引用就是 Lambda 表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是 Lambda 表达式的一个语法糖。
- 格式:使用方法引用操作符 “::” 将类(或对象) 与 方法名分隔开来。
- 两个:中间不能有空格,而且必须英文状态下半角输入
- 如下三种主要使用情况:
- 情况1:对象 :: 实例方法名
- 情况2:类 :: 静态方法名
- 情况3:类 :: 实例方法名
理解:类(或对象) :: 要调用的类(或对象)中的方法
要求1:
- Lambda 体只有一句语句,并且是通过调用一个对象的/类现有的方法来完成的
要求2:
- 针对情况1:函数式接口中的抽象方法 a 在被重写时使用了某一个对象的方法 b。如果方法 a 的形参列表、返回值类型与方法 b 的形参列表、返回值类型都相同,则我们可以使用方法 b 实现对方法 a 的重写、替换。
注意: 此方法是实例方法,需要对象调用!
- 针对情况2:函数式接口中的抽象方法a在被重写时使用了某一个类的静态方法b。如果方法a的形参列表、返回值类型与方法b的形参列表、返回值类型都相同,则我们可以使用方法b实现对方法a的重写、替换。
注意: 此方法是静态方法,需要类调用!
- 针对情况3:函数式接口中的抽象方法a在被重写时使用了某一个对象的方法b。如果方法a的返回值类型与方法b的返回值类型相同,同时方法a的形参列表中有n个参数,方法b的形参列表有n-1个参数,且方法a的第1个参数作为方法b的调用者,且方法a的后n-1参数与方法b的n-1参数匹配(类型相同或满足多态场景也可以)
注意: 此方法b是非静态方法,需要对象调用。但是形式上,写成对象a所属的类调用
理解了方法引用,构造器引用、数组引用就很好理解了。
-
构造器引用格式:
接口<泛型> 引用 = 类名 :: new
,调用的构造器由泛型参数决定。 -
数组引用格式:
接口<泛型> 引用 = 数组名[] :: new
,数组的初始化容量由泛型参数决定。