快速学习Java8新特性第四讲——方法引用与构造器引用
为何要使用方法引用与构造器引用?
如果不使用Lambda表达式进行程序编写的话,那么大可不必关注方法引用和构造器引用,但是如果使用Lambda表达式,再配合方法引用和构造器引用之后,那么可以使Lambda编写匿名内部类的代码变得更加简洁。在不影响性能的前提下简洁的代码可以增强代码的可读性(当然是在阅读者知晓对方语法的前提下)。
方法引用
方法引用是什么?
当要传递给Lambda体的操作,已经有实现的方法了,那么这时便可以使用方法引用了。也可以理解为方法引用是Lambda表达式的另外一种表现形式。不过有一点需要我们注意:Lambda体中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的参数列表与返回值类型保持一致!
方法引用的语法格式
方法引用使用操作符::
将方法名和对象或类的名字分隔开来。方法引用主要有三种语法格式,它们分别是:
下面我会分别一一介绍这三种语法格式。
第一种语法格式:对象::实例方法名
观察如下的Java程序,你会看到在Lambda体中有一个println()方法已经完成了我们要操作的功能(即完成了在Lambda体中所写的功能),那么,在这种情况下我们就可以使用方法引用了!
在使用方法引用时,有一个前提:你需要实现的接口(例如Consumer<T>
)中的抽象方法的参数列表与返回值类型要与我们当前调用的方法的参数列表与返回值类型保持一致!这点一定要引起我们的注意。
再来看另外一个案例,使用Lambda表达式来实现供给型接口时,发现在Lambda体中已经有实现的方法了,这时我们也可以使用方法引用。
其中,Employee实体类的内容如下:
package com.meimeixia.java8;
public class Employee {
private int id;
private String name;
private int age;
private double salary;
public Employee() {
}
public Employee(int id, String name, int age, double salary) {
super();
this.id = id;
this.name = name;
this.age = age;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", age=" + age + ", salary=" + salary + "]";
}
}
第二种语法格式:类::静态方法名
使用方法引用的这种格式,可以引用类的静态方法。
你可以查看一下Integer.compare()方法的参数列表与返回值类型和Comparator接口中compare()方法的参数列表与返回值类型是不是一致的?显然是一致的。
第三种语法格式:类::实例方法名
使用方法引用的这种格式得有一个前提,也可以说是规则,即Lambda表达式要有两个参数,第一个参数是你这个方法(实例方法)的调用者,而第二个参数是你要调用方法(实例方法)的参数。
构造器引用
构造器引用的语法格式是ClassName::new
。它与函数式接口相结合,自动与函数式接口中方法兼容,可以把构造器引用赋值给定义的方法,但构造器的参数列表要与接口中抽象方法的参数列表保持一致!
为了演示构造器引用,我们可以在Employee实体类中多写几个构造方法,如下图所示。
然后,使用一下构造器引用的方式。
不知你有没有想过,Employee实体类中有好几个构造器,那么现在调用的是哪个构造器呢?道理跟方法引用一样,由于构造器的参数列表要与接口中抽象方法的参数列表保持一致,所以此时调用的是无参的构造器。
现在,我要调用Employee实体类中一个参数的构造器,那该怎么办呢?
数组引用
数组引用的语法格式是Type[]::new
。下面我就通过一个案例简单使用一下数组引用。
至此,Java 8中有关Lambda表达式的所有内容我就算是总结完了!接下来开始学习Java 8中另外一个最核心的新特性,即Stream API。
推荐阅读
-
java8新特性(方法引用和构造器引用)
-
Java8新特性-004-方法、构造器、数组引用
-
Java8新特性——————Lambda表达式,函数式(Functional)接口,方法引用与构造器引用
-
【Java 20】Java8的其他新特性 - Lambda表达式、函数式接口、方法引用、构造器引用、数组引用、Stream API、Optional类
-
快速学习Java8新特性第四讲——方法引用与构造器引用
-
java8新特性总结——lambda表达式之方法引用与构造器引用
-
【Java8新特性】浅谈方法引用和构造器引用
-
java中java8新特性方法引用和构造器引用
-
java8新特性(方法引用和构造器引用)
-
Java8新特性 - (方法引用与构造器引用)