【有书共读】Java攻略 读书笔记04
可变参数构造函数
首先为Person类加入一个可变参数构造函数
public class Person { private String name; public Person(String... name){ this.name = Arrays.stream(names) .collect(Collectors.joining(" ")); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
如何调用这个构造函数呢?
方案:利用String类定义的split方法,传入一个定界符并返回一个String数组。
String[] split(String delimiter)
//将列表中的每个字符串拆分为单个单词,并调用可变参数构造函数 names.stream() //创建字符串流 .map(name -> name.split(" ")) //映射到字符串数组流 .map(Person::new) //映射到Person流 .collect(Collectors.toList());//收集到Person列表 System.out.println("Varargs ctor,names=" + Arrays.asList(names));
在上述例子中,map方法的上下文包含了Person::new构造函数引用,它是一个字符串数组流,因此将调用可变参数构造函数
数组
构造函数引用也可以和数组一起使用。如果希望采用Person实例的数组(Person[])而非列表,可以使用Stream接口定义的toArray方法,它的签名是:
<A> A[] toArray(IntFunction<A[]> generator)
toArray方法采用A表示返回数组的泛型类型。数组包含流的元素,由generator函数创建。
Person[] people = names.stream() .map(Person::new) //Person的构造函数引用 .toArray(Person[]::new); //Person数组的构造函数引用
toArray方法参数创建了一个大小合适的Person引用数组,并采用经过实例化的Person实例进行填充
构造函数引用其实是方法引用的别称,通过关键字new调用构造函数。同样,由上下文决定调用哪个构造函数。在处理流时,构造函数引用可以提供很大的灵活性。
#Java##读书笔记##笔记#