在这篇博文中,我们将通过实例来学习构造函数引用的教程。
构造函数引用介绍
和方法引用一样,构造函数的引用也可以被创建来做对象的初始化。方法引用使用方法名,构造函数引用使用new关键字和类名。
语法
构造函数引用示例
下面是一个引用字符串类名的例子。使用new操作符调用字符串构造器
Supplier stringSupplier = String::new
带参数的构造函数引用示例
首先,在下面的例子中,创建一个带有name和id参数的学生类。
class Student {
String name;
Integer id;
// Student Contructor
public Student(String name, Integer id) {
this.name = name;
this.id = id;
}
}
第二步是为学生类创建一个Factory Singleton类。
interface StudentFactory {
public abstract Student getStudent(String name, Integer id);
}
StudentFactory是一个功能接口,它有一个抽象的方法--getStudent StudentFactory.getStudent()返回Student对象。
接下来是使用构造函数引用和提供两个参数/参数来创建一个学生对象。
StudentFactory studentFactory = Student::new;
Student student = studentFactory.getStudent("John", 11);
System.out.println(student);
使用new操作符创建学生对象的构造器引用,并将引用指向StudentFactory。返回的抽象方法与类的构造函数getStudent()方法相同,StudentFactory的方法被调用并带有参数,它在内部执行Student类的构造函数。
带参数的BiFunction构造函数引用示例
这是带参数的构造函数引用的另一种方式。BiFunction是一个具有单一抽象方法apply的功能接口,它接受两个参数作为参数并产生输出结果。
BiFunction function = Student::new;
Student student=function.apply("Kiran",12);
System.out.println(student);
构造函数引用数组示例
到目前为止,我们只看到了创建实例的构造函数引用,我们也可以使用引用创建一个数组
A[] toArray(IntFunction generator)
toArray()是一个终端操作,它从String中获取元素并转换为一个元素的数组。它接受一个IntFunction的数组。IntFunction是一个功能接口,有一个抽象的方法,它接受int值并输出结果。首先用默认的构造函数创建一个用户对象
class User {
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
创建一个字符串列表,我们使用带有lambda表达式的单参数构造函数将这个字符串列表映射到用户实例。
List usernames = Arrays.asList("Kiran", "Franc", "Tom", "John");
List users = usernames.stream().map(name -> new User(name)) // lambda expression
.collect(Collectors.toList());
我们用构造函数引用代替了lambda表达式,如下所示:使用一个参数构造函数为一个对象数组创建了流,Map方法在流数组的每个字符串上被调用。构造函数引用--User::new为数组的每个字符串创建,它用一个参数调用User构造函数。
List users1 = usernames.stream().map(User::new) // Constructor reference
.collect(Collectors.toList());
现在我们将看到构造函数引用数组的例子。字符串流被传递给带有构造函数引用的map方法,最后调用toArray(),返回流中的元素数组。
User[] users2 = usernames.stream().map(User::new) // constructor reference for User object
.toArray(User[]::new); // constructor reference for User array object