方法引用和构造器引用

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hanniel/article/details/81877750 1.
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hanniel/article/details/81877750

1. 方法引用(method reference)

1. 1 何时使用

方法引用Java8 的新特性。

我们知道,使用Lambda表达式可以极大地简化我们的代码,但有时候Lambda体中的功能已经有现成的方法实现了,这时我们可以直接使用方法引用,而不是重复地去实现该功能。

方法引用可以理解为Lambda表达式的另一种表现形式。

1.2 使用前提

方法引用引用的方法的参数列表和返回值类型,必须和函数式接口中抽象方法的参数列表和返回值类型保持一致。

1.3 语法格式

方法引用常用的有3种格式:

1.3.1 实例对象::实例方法名

    public static void main(String[] args) {
        String str = "Hello world";
        Supplier<String> sup = () -> str.toUpperCase();
        System.out.println(sup.get());
    }

上面的代码中使用了Lambda表达式,表达式中的功能和str对象的toUpperCase()方法一样,因此,可以直接使用方法引用,如下:

    public static void main(String[] args) {
        String str = "Hello world";
        //Supplier<String> sup = () -> str.toUpperCase();
        Supplier<String> sup = str::toUpperCase;
        System.out.println(sup.get());
    }

另一个例子:

    public static void main(String[] args) {
        String str = "Hello world";
        //传统的Lambda表达式
        Consumer con = (x) -> System.out.println(x);
        con.accept(str);
        System.out.println("-----------------------");
        // 使用方法引用
        Consumer con1 = System.out::println;
        con1.accept(str);
    }

1.3.2 类名::静态方法名

    public static void main(String[] args) {
        float a = 3.6f; 
        // 传统的Lambda表达式
        Function<Float, Integer> fun = (x) -> Math.round(x);
        System.out.println(fun.apply(a));
        System.out.println("-----------------");
        // 使用方法引用
        Function<Float, Integer> fun1 = Math::round;
        System.out.println(fun.apply(a));
    }

1.3.3 类名::实例方法名

public class Person {
    public void say() {
        System.out.println("hello");
    }
    public static void main(String[] args) {
        //传统Lambda表达式
        Consumer<Person> con = (x) -> x.say();
        con.accept(new Person());
        System.out.println("-------------------");
        // 使用方法引用
        Consumer<Person> con1 = Person::say;
        con1.accept(new Person());
    }
}

脚下留心:若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式: ClassName::MethodName,如下所示:

     // 测试两个字符串是否相等 
    public static void main(String[] args) {
        // 传统的Lambda表达式
        BiPredicate<String, String> bp = (x, y) -> x.equals(y);
        System.out.println(bp.test("abc", "ab"));
        System.out.println("-----------------");
        // 使用方法引用
        BiPredicate<String, String> bp1 = String::equals;
        System.out.println(bp1.test("abc", "ab"));
    }

2. 构造器引用

2.1 使用前提

使用当构造器的参数列表与函数式接口中抽象方法的参数列表一致。

2.2 语法: 类名::new

    public static void main(String[] args) {
        // 传统的Lambda表达式
        Function<String, StringBuffer> fun = (x) -> new StringBuffer(x);
        // 使用方法引用
        Function<String, StringBuffer> fun1 = StringBuffer::new;
    }

3. 数组引用

数组引用的使用基本和构造器引用相同。

3.1 语法:类型[]::new

 // 生成指定长度的字符串数组
public static void main(String[] args) {
    // 传统的Lambda表达式
    Function<Integer, String[]> fun = (e) -> new String[e];
    String[] str = fun.apply(5);
    System.out.println(str.length);
    System.out.println("---------------------------");
    // 使用方法引用
    Function<Integer, String[]> fun1 = String[]::new;
    String[] str1 = fun1.apply(7);
    System.out.println(str1.length);
}
目录
相关文章
|
存储 Linux 虚拟化
Vsphere创建内容库Iso以及创建esxi虚拟机
Vcenter创建虚拟机 1.创建iso内容库 1)点击内容库
2064 0
Vsphere创建内容库Iso以及创建esxi虚拟机
|
9月前
|
人工智能 监控 算法
销售易CRM:功能与优势全解析
销售易CRM是国内领先的客户关系管理(CRM)系统,提供强大的销售管理、全方位客户管理、丰富的营销自动化工具、智能AI赋能及灵活的开放性平台。其功能涵盖线索获取、商机管理、客户画像、营销活动策划、智能预测等,支持企业高效管理客户、优化业务流程、提升销售效率和客户满意度。通过灵活的二次开发和API接口,销售易CRM可无缝集成企业现有系统,助力企业在数字化转型中实现业绩高质量增长。
|
自然语言处理 大数据 应用服务中间件
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
256 5
|
11月前
|
vr&ar 云计算 UED
实时云渲染:推动XR技术产业化发展的关键技术之一
近年来,企业利用扩展现实(XR)为用户提供沉浸式虚拟环境,Cloud XR、协同技术和GPU资源池化技术成为XR产业应用的关键。Cloud XR通过云端计算资源实现高效图形渲染,降低终端要求;协同技术助力实时协作,提升团队效率;GPU资源池化则优化资源分配,降低成本。平行云LarkXR提供全面的解决方案,推动XR技术广泛应用。
347 18
|
运维 Prometheus 监控
提升运维效率:自动化工具的应用与实践
运维工作作为信息技术领域的重要组成部分,其效率和质量直接关系到整个系统的稳定运行。随着科技的进步,自动化工具在运维中的应用越来越广泛。本文将探讨几种常见的自动化工具及其在实际操作中的应用案例,旨在为读者提供一些提升运维效率的思路和方法。通过合理利用这些工具,运维人员不仅可以提高工作效率,还能有效降低出错率,从而保障系统的高可用性。
336 24
|
前端开发 中间件 API
bottle,Python轻量级的Web框架!
bottle,Python轻量级的Web框架!
342 1
|
机器学习/深度学习 运维 算法
从聚类(Clustering)到异常检测(Anomaly Detection):常用无监督学习方法的优缺点
从聚类(Clustering)到异常检测(Anomaly Detection):常用无监督学习方法的优缺点
568 0
|
自然语言处理 供应链 Cloud Native
天源迪科与阿里云发布联合解决方案,基于阿里云原生产品打造卓越的数字化采购平台
随着云上时代日益蓬勃,云原生成为企业精益实践的最好“扶手”,助力企业在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。
3523 107
天源迪科与阿里云发布联合解决方案,基于阿里云原生产品打造卓越的数字化采购平台
three.js实现球体
使用three实现一个球体
655 2
three.js实现球体
|
云安全 弹性计算 运维
阿里云ACP考试流程是什么?多少分能通过?
阿里云ACP证书是云计算行业及据含金量的证书,不仅能让你进入阿里云的大门,还能让你成为大多数业内企业的认可,但是关于考试的具体要求很多人不了解,这篇文章详细介绍一下。
1709 0
阿里云ACP考试流程是什么?多少分能通过?