方法引用和构造器引用

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 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());
    }
AI 代码解读

上面的代码中使用了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());
    }
AI 代码解读

另一个例子:

    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);
    }
AI 代码解读

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));
    }
AI 代码解读

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());
    }
}
AI 代码解读

脚下留心:若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"));
    }
AI 代码解读

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;
    }
AI 代码解读

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);
}
AI 代码解读
目录
打赏
0
0
0
0
1
分享
相关文章
Vsphere创建内容库Iso以及创建esxi虚拟机
Vcenter创建虚拟机 1.创建iso内容库 1)点击内容库
1840 0
Vsphere创建内容库Iso以及创建esxi虚拟机
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
180 5
Spring揭秘:ApplicationContextAware应用场景及实现原理!
ApplicationContextAware接口能够轻松感知并在Spring中获取应用上下文,进而访问容器中的其他Bean和资源,这增强了组件间的解耦,了代码的灵活性和可扩展性,是Spring框架中实现高级功能的关键接口之一。
302 5
Spring揭秘:ApplicationContextAware应用场景及实现原理!
在ASM中为应用服务启用SLO(1):服务等级目标SLO概览
服务等级目标 (SLO) 提供了一种形式化的方式来描述、衡量和监控微服务应用程序的性能、质量和可靠性。SLO 为应用开发和平台团队、运维团队提供了一个共享的质量基准,作为衡量服务水平质量以及持续改进的参考。SLO 由一个或多个服务等级指标 (SLI) 组成。使用 SLI 组合定义的 SLO 允许团队以更精确和相关的方式描述服务健康状况。 阿里云服务网格ASM提供了开箱即用的基于服务等级目标SLO的监控和告警能力,用于监控应用服务之间调用的延迟和错误率特征。
745 1
在ASM中为应用服务启用SLO(1):服务等级目标SLO概览
AI 绘图:MidJourney 的提示语句(Prompt)怎么写?
这篇文章主要总结了在 AI 绘画中,使用 MidJourney 时提示语句 Prompt 的写法。
2347 0
AI 绘图:MidJourney 的提示语句(Prompt)怎么写?
带你读《5G 无线增强设计与国际标准》第三章增强多天线技术3.3多点传输协作(三)
带你读《5G 无线增强设计与国际标准》第三章增强多天线技术3.3多点传输协作
带你读《5G 无线增强设计与国际标准》第三章增强多天线技术3.3多点传输协作(三)
three.js实现球体
使用three实现一个球体
588 2
three.js实现球体
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问