携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情
今天,想了一下,发现上次 Lambda 表达式还没有整理结束,上一篇关于 Lambda 表达式的内容,整理的基本上都是函数式接口的东西,因为过程中涉及到了函数式接口,之前也不太懂,所以就稍微延伸了一下。今天继续,Lambda 表达式......
方法引用
当要传递给 Lambda 表达式体的操作,已经有实现的方法了,就可以使用方法引用。实现抽象方法的参数列表,必须与方法引用的参数列表一致,方法的返回值也必须一致,即方法的签名一致。方法引用,可以理解为是 Lambda 表达式的另一种表现形式。
语法
使用操作符 "::" 将对象或类 与 方法名分隔开
场景
- 对象::实例方法名
/*
printStream 中的 println 方法定义:
public void println(String x) {
synchronized(this) {
print(x);
newLine();
}
}
*/
public void demo01() {
PrintStream ps = System.out;
Consumer<String> consumer = out::println;
consumer.accept("Hello,World!");
}
- 类::静态方法名
/*
Integer 类中的静态方法 compare 的定义:
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1)
; }
*/
public void demo02() {
Comparator<Integer> comparable = (x,y) -> Integer.compare(x,y);
System.out.println(comparable.compare(5,3)); // 结果:1
//使用方法引用实现上述 Lambda 表达式的效果
Comparator<Integer> integerComparable = Integer::compare;
System.out.println(integerComparable.compare(5,3)); //结果:1
}
- 类::实例方法名
public void demo03() {
BiPredicate<String,String> bp1 = (x,y) -> x.equals(y);
System.out.println(bp1.test("5","3")); //结果:false
//使用方法引用实现上述 Lambda 表达式的效果
BiPredicate<String,String> bp2 = String::eqals;
System.out.println(bp2.test("5","3")); //结果:false
}
构造器引用
结合函数式接口,自动与函数式接口中方法兼容,可以把构造器引用赋值给定义的方法。注意:构造器参数列表要与接口中抽象方法的参数列表一致。
语法
类名::new
案例
创建一个学生实体类 Student
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private Integer id;
private String name;
private Integer age;
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name=" + name + '\'' +
", age=" + age +
'}';
}
}
构造器引用结合函数式接口
public void demo04() {
//无参构造
Supplier<Student> supplier = Student::new;
System.out.println(supplier.get());
//有参构造
Function<Integer, Student> function = Student::new;
System.out.prnitln(function.apply(5));
BiFunction<Integer, Integer, Student> biFunction = Student::new;
System.out.println(biFunction.apply(10,22));
}
结果:
Student{id=null, name='null', age=null}
Student{id=5, name='null', age=null}
Student{id=10, name='null', age=22}
数组引用
语法
type[]::new
案例
public void demo05() {
Function<Integer, String[]> function = String[]::new;
String[] strArr = function.apply(10);
System.out.println(strArr.length); //结果:10
}
整理了几种引用,类似 Lambda 表达式的另一种表达形式,使用起来也是能够大大简化代码的书写量......
希望本文能够帮到你,如有错误,望指正!
我向你敬礼啊,Salute!