150、说一下什么是方法引用和构造器引用
①方法引用:若Lambda体中的内容有方法已经实现了,我们可以使用方法引用,可以把方法引用理解为是Lambda表达式的另外一种表现形式。主要有三种语法格式:
- 对象::实例方法名
- 类::静态方法名
- 类::实例方法名
注意:
- Lambda体中调用方法的参数列表和返回值类型要与函数式接口中抽象方法的参数列表和返回值类型保持一致。
- 若Lambda参数列表中的第一参数是 实例方法的调用者,第二参数是实例方法的参数时,可以使用类::实例方法名
先看第一种语法格式——对象::实例方法名
//1、对象::实例方法名
@Test
public void test1(){
//不使用方法引用
PrintStream ps = System.out;
Consumer<String> con = (x) -> ps.println(x);
con.accept("yuzhansheng");
//使用方法引用
PrintStream ps1 = System.out;
Consumer<String> con1 = ps1::println;
con1.accept("yuzhansheng");
//更加简单的写法
Consumer<String> con2 = System.out::println;
con2.accept("yuzhansheng");
}
以上的三种写法实现的结果是完全一样的。
再看第二种语法格式——类::静态方法名
//2、类::静态方法名
@Test
public void test2(){
//不使用方法引用
Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
//使用方法引用
Comparator<Integer> com1 = Integer::compare;
}
再看第二种语法格式——类::实例方法名
“若Lambda参数列表中的第一参数是 实例方法的调用者,第二参数是实例方法的参数时,才可以使用类::实例方法名”
//3、类::实例方法名
@Test
public void test3(){
//不使用方法引用
BiPredicate<String,String> bp = (x,y) -> x.equals(y);
//使用方法引用
BiPredicate<String,String> bp1 = String::equals;
}
②构造器引用:格式:ClassName::new
注意:需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致。
//4、构造器引用
@Test
public void test4(){
//不使用构造器引用
Supplier<Employee> sup = () -> new Employee();
//使用构造器引用
Supplier<Employee> sup2 = Employee::new;
}
③数组引用 : 格式:type[] :: new
@Test
public void test5() {
//不使用数组引用
Function<Integer, String[]> function = (args) -> new String[args];
String[] strs = function.apply(10);
System.out.println(strs.length);
//使用数组引用
Function<Integer, Employee[]> function2 = Employee[] :: new;
Employee[] employees = function2.apply(20);
System.out.println(employees.length);
}