Lambda的更高级——方法引用,构造器引用,数组引用

前言——Lambda表达式的本质:作为函数式接口的实例——省略部分代码。

函数式接口:如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口。我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。

 

总的来说,Lambda是接口匿名内部类书写的简化版,方法引用、构造器引用、数组引用时Lambda的简化版。

 

一、方法引用。

见上一篇文章

https://blog.csdn.net/ly_xiamu/article/details/106771969

方法引用——本质上就是Lambda表达式——具体使用的三种情况举例

 



二、构造器引用。

*     格式为     对象::new

*      和方法引用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致。
*      抽象方法的返回值类型即为构造器所属的类的类型,举例如下

//构造器引用
    //Supplier中的T get()
    //Employee的空参构造器:Employee()
    @Test
    public void test1(){

        Supplier<Employee> sup = new Supplier<Employee>() {
            @Override
            public Employee get() {
                return new Employee();
            }
        };
        System.out.println("*******************");

        Supplier<Employee>  sup1 = () -> new Employee();
        System.out.println(sup1.get());

        System.out.println("*******************");

        Supplier<Employee>  sup2 = Employee :: new;
        System.out.println(sup2.get());
    }

	//Function中的R apply(T t)
    @Test
    public void test2(){
        Function<Integer,Employee> func1 = id -> new Employee(id);
        Employee employee = func1.apply(1001);
        System.out.println(employee);

        System.out.println("*******************");

        Function<Integer,Employee> func2 = Employee :: new;
        Employee employee1 = func2.apply(1002);
        System.out.println(employee1);

    }

	//BiFunction中的R apply(T t,U u)
    @Test
    public void test3(){
        BiFunction<Integer,String,Employee> func1 = (id,name) -> new Employee(id,name);
        System.out.println(func1.apply(1001,"Tom"));

        System.out.println("*******************");

        BiFunction<Integer,String,Employee> func2 = Employee :: new;
        System.out.println(func2.apply(1002,"Tom"));

    }

 


 三、数组引用

格式为  type [] :: new

*     大家可以把数组看做是一个特殊的类,则写法与构造器引用一致。如下:

	//数组引用
    //Function中的R apply(T t)
    @Test
    public void test4(){
        Function<Integer,String[]> func1 = length -> new String[length];
        String[] arr1 = func1.apply(5);
        System.out.println(Arrays.toString(arr1));

        System.out.println("*******************");

        Function<Integer,String[]> func2 = String[] :: new;
        String[] arr2 = func2.apply(10);
        System.out.println(Arrays.toString(arr2));

    }

 

辅助阅读:java8的新特性之一——Lambda的6种语法格式——举例对比前后差异

https://blog.csdn.net/ly_xiamu/article/details/106770790

 

一个程序员的自我修养和成长…
这里可以找到我,微信公众号。
在这里插入图片描述

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值