java基础之Java8新特性-方法引入

目录

1.简介

2.方法引入

方法引入遵循规范

方法引入种类

1.静态方法引入

2.对象方法引入

3.实例方法引入

4.构造函数引入


1.简介

方法引用是 Java 8 中引入的另一个重要特性,它提供了一种简洁的语法来直接引用现有方法或构造函数。方法引用可以看作是 Lambda 表达式的一种简化写法,它可以让代码更加简洁易懂。

什么是Lambda 表达式呢?

可以参考另一篇文章:

java基础之Java8新特性-Lambda-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_62262918/article/details/135395534?spm=1001.2014.3001.5501

示例代码仓库地址:

j8-new-feature: java8新特性示例Demo (gitee.com)icon-default.png?t=N7T8https://gitee.com/mi9688-wine/j8-new-feature

2.方法引入

方法引入遵循规范

当使用方法引用时,被引用的方法的参数类型和返回类型必须与函数式接口的抽象方法相匹配。

方法引入种类

方法引入共有四种分别为静态方法引用(类名::静态方法名)、对象方法引入(类名::实例方法名)、实例方法引入(对象名::方法名)、构造函数引入(类名::new)。

1.静态方法引入

首先我们定义一个函数接口

@FunctionalInterface
public interface MessageInterface {
    void printMessage(String msg); // 打印内容
}

接着我们调用该接口的printMessage方法就需要重写该接口的该方法。

传统使用匿名内部类的方式

        //传统匿名内部类方式
        new MessageInterface(){

            @Override
            public void printMessage(String msg) {
                System.out.println("打印内容:"+msg);
            }
        }.printMessage("hello");

使用Lambda的方式

        //使用Lambda
        ((MessageInterface) msg -> System.out.println("打印内容:" + msg)).printMessage("hello");

使用静态方法引入

定义出该静态方法(在某个类里面)这里是图方便直接写在在Test01类里面定义的,然后引用

    //定义静态方法
    public static void staticPrintMessage(String msg){
        System.out.println("打印内容:"+msg);
    }
        //静态方法引入
        MessageInterface m=Test01::staticPrintMessage;
        m.printMessage("hello");

完整示例代码

public class Test01 {
    public static void main(String[] args) {
        //传统匿名内部类方式
        new MessageInterface(){

            @Override
            public void printMessage(String msg) {
                System.out.println("打印内容:"+msg);
            }
        }.printMessage("hello");


        //使用Lambda
        ((MessageInterface) msg -> System.out.println("打印内容:" + msg)).printMessage("hello");

        //静态方法引入
        MessageInterface m=Test01::staticPrintMessage;
        m.printMessage("hello");
        //简化的写法
        ((MessageInterface) Test01::staticPrintMessage).printMessage("hello");


    }
    //定义静态方法
    public static void staticPrintMessage(String msg){
        System.out.println("打印内容:"+msg);
    }
}

可以看到使用方法引入对比Lambda表达式的写法看起来更简短,直接类名::静态方法名;相对于Lambda为何没有参数列表呢?或者说直接省略不写呢?原因很简单就是:被引用的方法的参数类型和返回类型必须与函数式接口的抽象方法相匹配。既然是匹配的那就不需要再写了。

其实也存在一种特例,就是当函数式接口的方法返回类型是void的时候,你定义的被引用方法的返回类型除了是void也可以是任意类型。

比如

@FunctionalInterface
public interface MessageInterface {
    void printMessage(String msg); // 打印内容
}

 public static String staticPrintMessage(String msg){
        System.out.println("打印内容:"+msg);
        return msg;
    }

        //静态方法引入
        MessageInterface m=Test01::staticPrintMessage;
        m.printMessage("hello");

这样会出现返回类型不一致的情况而不报错,可以正常运行。我理解为就是当函数式接口方法返回类型是void就只需要关注方法的参数和方法的行为,而不需要关注方法的返回值。这里的返回值当作无效的返回值处理了。只有当函数式接口方法返回类型不是void,也就是有返回值时才会关注方法的返回值,并校验是否一致。

如果用说Lambda表达式的方式实现函数式接口,本质就是传入一个匿名函数参数;那用方法引入的方式实现函数式接口本质上也是传入了一个函数参数,只不过这个函数是通过方法引用的方式来实现的,它并不是匿名的。

2.对象方法引入

首先在Message类写个计算内容行数的方法

 //计算信息内容行数
    public int lineCount(){
        return (this.content.length()/80)+1;
    }

定义函数接口

@FunctionalInterface
public interface MessageInterface3 {
    int getMessageRow(Message msg); //获取信息内容行数
}

实现函数接口

  public static void main(String[] args) {
        //Lambda
        MessageInterface3 m = (msg) -> {
            return msg.lineCount();
        };
        System.out.println(m.getMessageRow(new Message()));

        System.out.println("----------------------");
        //对象方法引入
        MessageInterface3 m1 = Message::lineCount;
        System.out.println(m1.getMessageRow(new Message()));
    }

看到这里你可能会思考为何这个lineCount方法不是静态方法却可以直接通过类名::方法名引用呢?

其实前面已经讲过了,就是你通过方法引入实现函数接口就必须保证被引用的方法的参数类型和返回类型必须与函数式接口的抽象方法相匹配,既然匹配了是不是可以省略了。

既然这个函数接口的getMessageRow方法入参是Message对象,那要实现它内部是不是得调用Message对象的 lineCount方法,传统匿名内部类代码:

 //匿名内部类
        MessageInterface3 m0 = new MessageInterface3() {
            @Override
            public int getMessageRow(Message msg) {
                return msg.lineCount();
            }
        };
        System.out.println(m0.getMessageRow(new Message()));

这里使用对象方法引入你就可以理解为把 ” (Message msg) “ 和 ”  msg.lineCount(); “ 省略成 ” Message::lineCount; “。

3.实例方法引入

实例方法引入就是new出来该对象,然后引用该实例对象的方法作为函数式接口的方法实现。

public class Test02 {
    public static void main(String[] args) {

        //实例化
        Test02 t = new Test02();
        //实例方法引用
        ((MessageInterface)t::printMessage).printMessage("Hello");

    }
    public void printMessage(String msg){
        System.out.println("打印内容:"+msg);
    }
}

4.构造函数引入

实现该函数接口需要重写getMessage方法返回值是Message类型

@FunctionalInterface
public interface MessageInterface2 {
    Message getMessage();
}
public static void main(String[] args) {
        //使用Lambda
        MessageInterface2  m1 = () -> new Message();
        System.out.println( m1.getMessage());

        System.out.println("----------------------");
        //使用构造方法引用
        MessageInterface2 m2 = Message::new;
        System.out.println( m2.getMessage());
        //简化写法
        System.out.println("----------------------");
        System.out.println(((MessageInterface2) Message::new).getMessage());
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/307938.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

复试 || 就业day14(2024.01.10)算法篇

文章目录 前言字符串中第二大的数字字符串中不同整数的数目判断句子是否为全字母句长度为三且各字符不同的子字符串检查是否区域内所有整数都被覆盖*重新分配字符使所有字符串都相等可以输入的最大单词数检查是否所有字符出现次数相同差的绝对值为 K 的数对数目至少在两个数组中…

设计模式之外观模式【结构型模式】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某…

数组计算模块NumPy

NumPy是Python数组计算、矩阵运算和科学计算的核心库。 提供了高性能的数组对象提供了大量的函数和方法NumPy使用机器学习中的操作变得简单NumPy是通过C语言实现的 NumPy的安装 pip install numpy 数组的分类 一维数组 跟Python列表的形状一样,区别在于数组的…

MongoDB—SQL到MongoDB映射图表

一、术语和概念 下表显示了各种 SQL 术语和概念 以及相应的 MongoDB 术语和概念。 SQL Terms/Concepts MongoDB Terms/Concepts database database table collection row document or BSON document column field index index table joins $lookup, embedded docu…

RV1126边缘计算AI盒子,支持4-6路1080p视频,2T 算力

1 产品概述 信迈推出基于瑞芯微Rockchip RV1126架构的AI边缘计算主板,RV1126芯片是四核ARM Cortex-A7,1.5GHz, RSIC-V 200MHz CPU ,NPU2.0Tops。AI边缘计算主板外围接口丰富,拥有超强扩展性,可广泛应用在智慧安防、工…

贝锐蒲公英云智慧组网解读:实现工业设备远程调试、异地PLC互联

这个时候,使用异地组网是非常有效的解决方案。在12月28日贝锐官方的直播中,请到了贝锐蒲公英的技术研发经理,为大家分享了贝锐蒲公英云智慧组网解决方案,以及蒲公英二层组网相关的技术和应用。 搜索“贝锐”官方视频号&#xff0c…

AI数据和测试评价

1数据收集和清洗 为了训练AI模型,需要收集和准备足够的数据。数据应该涵盖各种情况和场景,以确保系统在各种情况下都能准确地运行。数据原始来源应该是真实的,并且应该涵盖系统预计的使用情况。数据应该根据特定的需求进行采样和处理,可以来自各种来源,例如公共数据集、第…

Oracle数据库19c OCP 1z0-082考场真题解析第24题

考试科目:1Z0-082 考试题量:90 通过分数:60% 考试时间:150min 本文为云贝教育郭一军guoyJoe原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。【云贝教育】Orac…

Matlab 之数据分布拟合

文章目录 Part.I IntroductionPart.II Distribution Fitter APP 的使用Chap.I APP 简介Chap.II 简单使用 Part.III 通过代码实现分布拟合Chap.I 基于 fitdist 函数Chap.II 获取数据的频率分布后进行曲线拟合 Reference Part.I Introduction 本文主要介绍了如何使用 Matlab 对数…

【Verilog】期末复习——分别画出下面两个程序综合后的电路图/reg型数据和wire型数据的区别

系列文章 数值(整数,实数,字符串)与数据类型(wire、reg、mem、parameter) 运算符 数据流建模 行为级建模 结构化建模 组合电路的设计和时序电路的设计 有限状态机的定义和分类 期末复习——数字逻辑电路分…

设计模式-空对象模式

设计模式专栏 模式介绍模式特点应用场景空对象模式和单例模式的区别代码示例Java实现空对象模式Python实现空对象模式 空对象模式在spring中的应用 模式介绍 空对象模式是一种设计模式,用于处理对象不存在的情况。它通过返回一个空对象来代替 null 值,从…

视频号小店发展趋势如何?适合新手吗?

我是电商珠珠 视频号团队在22年7月发展了自己的电商平台-视频号小店。截止到目前为止,也发展了不过一年的时间,所以各项平台政策还不太严谨。 一个新兴平台所做的第一步就是招揽更多的商家来入驻,就会将红利全部倾向商家,而在今…

6.1.2捕捉图像(3)

6.文字捕捉 除了可以捕捉图像外,HyperSnap6还有一个非常神奇、非常实用的功能——文字捕捉。利用文字捕捉,可以把一段不可复制的文字捕捉下来,以便于重新编辑。 (1)右单击桌面上的“我的电脑”,在弹出的快捷菜单中选…

Kubernetes(K8S)云服务器实操TKE

一、 Kubernetes(K8S)简介 Kubernetes源于希腊语,意为舵手,因为首尾字母中间正好有8个字母,简称为K8S。Kubernetes是当今最流行的开源容器管理平台,是 Google 发起并维护的基于 Docker 的开源容器集群管理系统。它是大名鼎鼎的Google Borg的开源版本。 K8s构建在 Docker …

世微 AP6608 DC-DC转换器 1.2MHz 2-24V 2A升压转换IC

FEATURES? Integrated 80mΩ Power MOSFET ? 2V to 24V Input Voltage ? 1.2MHz Fixed Switching Frequency ? Internal 4A Switch Current Limit ? Adjustable Output Voltage ? Internal Compensation ? Up to 28V Output Voltage ? Automatic Pulse Frequency Modul…

聚道云软件连接器助力某电商企业实现电商业务与财务系统的数据互通

客户介绍: 某电商企业是一家集电商平台、仓储物流、售后服务等业务于一体的综合性电商企业。公司业务遍布全国多个城市,拥有庞大的客户群和销售额。 添加图片注释,不超过 140 字(可选) 客户痛点: 有赞商…

高通ais over hab高概率导致安卓系统起不来原因分析及解决方案

一)ais概述 高通8155的摄像头驱动在hostOS qnx上,guestOS 安卓要使用摄像头,就需要就需要通过hab机制与qnx通信。 Ais框架如下 二)ais的控制通道与数据通道 a)控制通道即,front end需要将start/stop摄像头的控制命令发…

arm64虚拟化技术与kvm实现原理分享

文章目录 1 简介2 arm64 虚拟化相关硬件支持2.1 arm64 cpu 虚拟化基本原理及硬件支持2.2 系统寄存器捕获和虚拟寄存器支持2.3 VHE 特性支持2.4 内存虚拟化支持2.5 IO 虚拟化支持2.6 DMA 虚拟化支持2.7 中断虚拟化支持2.8 定时器虚拟化支持 3 arm64 kvm 初始化流程3.1 初始化总体…

烟火检测/区域人流统计/AI智能分析网关V4如何配置通道?

TSINGSEE青犀智能分析网关(V4版)是一款高性能、低功耗的软硬一体AI边缘计算硬件设备,硬件内部署了近40种AI算法模型,支持对接入的视频图像进行人、车、物、行为等实时检测分析,并上报识别结果,并能进行语音…

vue cli脚手架

1. vue cli 脚手架安装 参考官网:https://cli.vuejs.org/zh/guide/installation.html 步骤如下: 全局安装 npm install -g vue/cli # OR yarn global add vue/cli查看版本 vue --version # OR vue -V升级Vue cli (需要升级的时候&#x…
最新文章