在这篇博文中,我们将通过实例来学习构造函数引用的教程。
什么是java中的构造函数引用?
构造函数引用是指用类名和new关键字创建的对象来引用一个类。与方法引用一样,可以创建对构造函数的引用来进行对象初始化。
method references 方法引用使用方法名,构造函数引用使用new关键字和类名。下面是一个语法
构造函数引用实例
这里是一个引用字符串类名的例子。使用new操作符调用字符串构造器
Supplier stringSupplier = String::new
带参数的构造器引用示例
首先,在下面的例子中,创建一个带有名称和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()返回学生对象。
接下来是使用构造函数引用和提供两个参数/参数来创建一个学生对象。
StudentFactory studentFactory = Student::new;
Student student = studentFactory.getStudent("John", 11);
System.out.println(student);
使用new操作符和StudentFactory引用来创建学生对象的构造器引用。StudentFactory的getStudent()方法被调用,该方法在内部执行学生类的构造器。
带参数的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<String> usernames = Arrays.asList("Kiran", "Franc", "Tom", "John");
List<User> users = usernames.stream().map(name -> new User(name)) // lambda expression
.collect(Collectors.toList());
我们使用单参数构造器将lambda表达式替换为构造器引用,如下所示。为一个对象的数组创建了Stream,Map方法在一个流数组的每个字符串上被调用。构造函数引用--User::new为数组的每个字符串创建,它用一个参数调用User构造函数。
List<User> 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