Java8 - 学习构造函数参考教程与实例

285 阅读3分钟

在这篇博文中,我们将通过实例来学习构造函数引用的教程

什么是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