方法的引用(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);
    }
}

 

posted @ 2022-10-19 13:53  想见玺1面  阅读(16)  评论(0编辑  收藏  举报