目录:
1、方法引用
若lambda体中的内容有方法已经实现了,我们可以使用"方法引用"(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!)可以理解为方法引用是lambda表达式的另外一种表现形式
。双冒号形式。
方法引用:使用操作符 “::” 将方法名和对象或类的名字分隔开来。
如下三种主要使用情况 :
- 对象 :: 实例方法
- 类 :: 静态方法
- 类 ::实例方法
1.1、对象 :: 实例方法
例如:
(x) -> System.out.println(x);
等同于:
System.out::println
1.2、类 :: 静态方法
例如:
BinaryOperator(Double) bo = (x,y) -> Math.pow(x,y);
等同于:
BinaryOperator(Double) bo = Math::pow;
1.3、类 ::实例方法
前提:第一个参数
是实例方法的调用者
,第二个参数
是实例方法的参数
例如:
等同于:
2、构造器引用
2.1、介绍
语法:
ClassName::new;
与函数式接口相结合,自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法,与构造器参数列表要与接口中抽象方法的参数列表一致!
例如:
等同于:
2.2、使用
实体类 Stu:
public class Stu {
private Integer id;
private String name;
private Integer age;
public Stu() {
}
public Stu(Integer id) {
this.id = id;
}
public Stu(Integer id, Integer age) {
this.id = id;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Stu{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试用例:
@Test
public void test4(){
//无参构造
Supplier<Stu> stuSupplier = ()-> new Stu();
System.out.println(stuSupplier.get());
//自动匹配类中和接口实现的抽象方法中参数列表一致的构造器(无参构造器)
Supplier<Stu> stuSupplier1 = Stu::new;
System.out.println(stuSupplier1.get());
//Stu{id=null, name='null', age=null}
//有一个参数的构造
Function<Integer,Stu> s1 = (x) -> new Stu(x);
System.out.println(s1.apply(1)); //Stu{id=1, name='null', age=null}
//自动匹配类中和接口实现的抽象方法中参数列表一致的构造器(单个Integer的构造器)
Function<Integer,Stu> s2 = Stu::new;
System.out.println(s2.apply(2)); //Stu{id=2, name='null', age=null}
//有两个参数的构造 BiFunction<T, U, R> R apply(T t, U u);
BiFunction<Integer,Integer,Stu> bf = (x,y) -> new Stu(x,y);
System.out.println(bf.apply(3,44)); //Stu{id=3, name='null', age=44}
//自动匹配类中和接口实现的抽象方法中参数列表一致的构造器(两个个Integer的构造器)
BiFunction<Integer,Integer,Stu> bf1 = Stu::new;
System.out.println(bf1.apply(4,55));//Stu{id=4, name='null', age=55}
}
3、数组引用
3.1、介绍
语法:
Type[]::new;
例如:
等同于:
3.2、使用
//数组引用 Type[]::new
@Test
public void test5(){
//创建指定长度的字符串数组
Function<Integer,String[]> f1 = (x) -> new String[x];
System.out.println(f1.apply(10).length); //10
Function<Integer,String[]> f2 = String[]::new;//数组引用 可以直接代替
System.out.println(f2.apply(20).length); //20
}