方法引用 当Lambda体中内容的方法已经实现,我们可以使用“方法引用”
(可以理解为方法引用是Lambda表达式的另一种表现形式)
方法引用:使用操作符 “::” 将方法名和对象或类的名字分隔开来。
方法引用主要有三类。
(1) 指向静态方法的方法引用(例如Integer的parseInt方法,写作Integer::parseInt)。--类::静态方法名
(2) 指向任意类型实例方法的方法引用( 例如String 的length 方法, 写作String::length)。 --类::实例方法名
(3) 指向现有对象的实例方法的方法引用(假设你有一个局部变量expensiveTransaction 用于存放Transaction类型的对象,它支持实例方法getValue,那么你就可以写expensive-Transaction::getValue)。 --对象::实例方法名
注意:
①Lambda体中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的函数列表和返回值类型保持一致
②如果Lambda参数列表中的第一参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用ClassName::method
实例1:对象::实例方法
/**
* @author Dongguo
* @date 2021/8/15 0015 6:36
* @description:方法引用 对象::实例方法名
*/
@Test
public void test1() {
Consumer con1 = (x) -> System.out.println("Hello World");
Consumer con2 = System.out::println;
con2.accept("Hello World");
System.out.println("-------------------------------------------");
Employee employee = new Employee("张三",18,3000);
Supplier sup1 = ()->employee.getAge();
System.out.println(sup1.get());
Supplier sup2 = employee::getAge;
System.out.println( sup2.get());
}
实例2:类::静态方法名
实现两个数值的比较
/**
* @author Dongguo
* @date 2021/8/15 0015 6:44
* @description:类::静态方法名
*/
@Test
public void test2(){
Comparator com1 = (x, y)->Integer.compare(x,y);
Comparator com2 = Integer::compare;
}
实例3:对象::实例方法名
判断两个字符串是否相同
/**
* @author Dongguo
* @date 2021/8/15 0015 6:44
* @description:类::静态方法名
*/
@Test
public void test2(){
BiPredicate bi1 = (x,y)->x.equals(y);
BiPredicate bi2 = String::equals;
}
二、构造器引用
对于一个现有构造函数,你可以利用它的名称和关键字new来创建它的一个引用:ClassName::new。它的功能与指向静态方法的引用类似。
格式:ClassName::new
注意:需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致
实例1:
@Test
public void test5() {
Supplier sup = () -> new Employee();
//构造器引用方式
Supplier sup1 = Employee::new;//自动匹配无参构造
Employee employee = sup1.get();
System.out.println(employee);
}
因为Supplier接口中的抽象方法T get(); 是无参的,所以new 对象自动匹配无参构造
运行结果:
Employee{name='null', age=null, salary=0.0}
实例2:
@Test
public void test6() {
Function fun = (x) -> new Employee(x);
Function fun1 = Employee::new;//自动匹配有参构造
Employee emp = fun1.apply(100);
System.out.println(emp);
}
因为Function接口中的抽象方法R apply(T t); 有一个参数,所以new 对象自动匹配有一个参数的构造函数
运行结果:
Employee{name='null', age=100, salary=0.0}
三、数组引用
这里单独把数组引用拿出来实际上是强调一下,数组引用和构造引用基本相同,直接上一个实例来说明问题
格式 type[]::new
实例1:创建一个数组
@Test
public void test7() {
Function fun = (x) -> new String[x];
String[] strs = fun.apply(10);
System.out.println(strs.length);
Function fun1 = String[]::new;
String[] strs1 = fun.apply(20);
System.out.println(strs1.length);
}