方法的引用(3)
类的构造器(构造方法)引用
由于构造器的名称与类名完全一样,并不固定。所以构造器引用使用类名称:∵new的格式表示。首先是一个简单的Person类:
public class Person { private String name; // get public String getName() { return name; } // set public void setName(String name) { this.name = name; } // 无参 public Person() { } // 有参 public Person(String name) { this.name = name; } }
然后是用来创建Person对象的函数式接口∶
/** * 定义一个创建person对象的函数式接口 */ @FunctionalInterface public interface PersonBuilder { // 定义一个方法,根据传递的姓名,创建person对象返回 Person builder(String name); }
构造器(构造方法)引用:
/** * 构造器(构造方法)引用 */ public class Demo { // 定义一个方法,参数传递姓名和personBuilder接口,方法中通过姓名创建person对象 public static void per(String name, PersonBuilder p){ Person builder = p.builder(name); System.out.println(builder.getName()); } public static void main(String[] args) { // 调用per方法,方法的参数personBuilder接口是一个函数式接口,可以传递lambda per("AAA",(String name) -> { return new Person(name); }); /** * 使用方法引用优化Lambda表达式 * 构造方法new Person(String name)已知创建对象已知new * 就可以使用Person引用new创建对象 */ // 使用Person类的带参构造方法,通过传递的姓名创建对象 per("BBB",Person :: new); } }
数组的构造器引用
数组也是object的子类对象,所以同样具有构造器,只是语法稍有不同。如果对应到Lambda的使用场景中时,需要一个函数式接口∶
/** * 定义一个创建数组的函数式接口 */ @FunctionalInterface public interface ArrayBuilder { // 定义一个创建int类型数组的方式,参数传递数组的长度,返回创建好的int类型数组 int[] builder(int length); }
更好的写法是使用数组的构造器引用:
/** * 数组的构造器引用 */ public class Text { /* 定义一个方法 方法的参数传递创建数组的长度和ArrayBuilder接口 方法内部根据传递的长度使用ArrayBuilder中的方法创建数组并返回 */ public static int[] create(int length,ArrayBuilder ab){ return ab.builder(length); } public static void main(String[] args) { // 调用create方法,传递数组的长度和Lambda表达式 int[] arr1 = create(10, (len) -> { // 根据数组的长度,创建数组并返回 return new int[len]; }); System.out.println(arr1.length); /* 使用方法引用优化Lambda表达式 已知创建的就是int[]数组 数组的长度也是已知的就可以使用方法引用 int[]引用new,根据参数传递的长度来创建数组 */ int[] arr2 = create(10,int[] :: new); System.out.println(Arrays.toString(arr2)); System.out.println(arr2.length); } }