方法引用与构造器引用
1. 概念
如果lambda体中的内容已经有方法实现了,可以使用方法引用代替整个lambda表达式。
2. 方法引用的语法格式
第一种:对象::方法名
代码示例:
public class Employee {
private String id;
private String name;
private Integer age;
private Integer salary;
private Status status;
public Employee() {
}
public Employee(String id){
this.id = id;
}
public Employee(String id, Integer age){
this.id = id;
this.age = age;
}
public Employee(String id, String name, Integer age, Integer salary) {
this.id = id;
this.name = name;
this.age = age;
this.salary = salary;
}
// 以下省略getter和setter方法以及toString方法
}
@Test
public void test02(){
Employee employee = new Employee("131", "tom", 18, 2222);
Supplier<String> supplier = employee::getName;
System.out.println(supplier.get());
}
Employee
类是本文中会被多次引用的一个实体类。在示例代码中,使用了Supplier
函数式接口,它的get
方法没有参数,只有返回值。如果不使用方法引用,Lambda表达式应该这样写:
Supplier<String> supplier = () -> employee.getName();
第二种:类::静态方法名
代码示例:
@Test
public void test03(){
// Lambda表达式
Comparator<Integer> com1 = ((o1, o2) -> Integer.compare(o1, o2));
// 方法引用
Comparator<Integer> com2 = Integer::compare;
}
这里直接引用了Integer
类的静态方法compare
。
第三种:类::实例方法名
代码示例:
@Test
public void test04(){
BiPredicate<String, String> biPredicate = String::equals;
}
BiPredicate
接口是一个函数式接口,它的test
方法接收两个参数,返回boolean值。在使用类::实例方法名时需要注意一点:
必须满足条件:第一个参数是实例方法的调用者,并且第二个参数的实例方法的参数
写成Lambda表达式:
BiPredicate<String, String> biPredicate = (s1, s2) -> s1.equals(s2);
小结
使用方法引用要求lambda表达式的参数列表和返回值要与引用的方法的参数列表和返回值一致。
构造器引用语法格式
ClassName::new
无参构造器的情况:
@Test
public void test05(){
Supplier<Employee> supplier = Employee::new;
Employee employee = supplier.get();
}
注意,这样写的前提是Employee类必须有一个无参构造器。与之对应的函数式接口Supplier
也是无参的。
一个参数的情况:
@Test
public void test06(){
Function<String, Employee> function = Employee::new;
Employee employee = function.apply("213465");
}
同样的,也要求Employee类有一个参数的构造器。与之对应的函数式接口Function
也是接收一个参数的。
两个参数的情况:
@Test
public void test07(){
BiFunction<String, Integer, Employee> function = Employee::new;
Employee employee = function.apply("12345", 35);
}
BiFunction是接收两个参数的函数式接口。
小结
要求需要调用的构造器的参数列表与函数式接口中的抽象方法的参数列表保持一致。
数组引用语法格式
Type[]::new;
代码示例:
@Test
public void test08(){
Function<Integer, String[]> function = String[]::new;
String[] strings = function.apply(10);
System.out.println(strings.length);
}
创建了一个容量为10的数组,并输出了它的大小。