第四十三条:方法引用优先于Lambda

什么是方法引用?


答:方法引用是对Lambda表达式符合某种情况下的一种缩写,使得我们的Lambda表达式更加的精简,也可以理解为Lambda表达式的另一种表现形式(缩写)

什么时候使用方法引用呢?
答:当要传递给Lambda体内的操作,已经有实现的方法了,就可以使用方法引用了



方法引用使用的前提条件是什么呢?


答:
    1.方法引用所引用的方法的参数列表必须要和函数式接口中抽象方法的参数列表相同(完全一致)

    2.方法引用所引用的方法的的返回值必须要和函数式接口中抽象方法的返回值相同(完全一致)


方法引用有什么语法格式吗?方法引用一般有三种格式:

    1. 实例对象名::实例方法名
    2. 类名::静态方法名
    3. 类名::实例方法名              (注意区别2,3的区别,下面会说)

2,3的区别:


    若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式: 类名::实例方法名 



举例一:1. 实例对象名::实例方法名(案例一)

public class Student {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public static void main(String[] args) {Student student = new Student("XiangYang",23);Supplier<String> supplier = ()->student.getName();System.out.println("Lambda形式: "+supplier.get());Supplier<String> supplier1 = student :: getName;System.out.println("方法引用形式: "+supplier1.get());}}

举例一: 1. 实例对象名::实例方法名 (案例二)

public class Test06 {public void test06(){//传统Lambda表达式Consumer<String> consumer = (x) -> System.out.println(x);consumer.accept("Hi: 我是Lambda表达式实现的!"); //打印:Hi: 我是Lambda表达式实现的!//方法引用实现consumer =System.out::println;consumer.accept("Hello : XiangYang,我是使用方法引用实现的 ");//打印:Hello : XiangYang,我是使用方法引用实现的}}

举例二: 2. 类名::静态方法名

	@Testpublic void test8() {//传统Lambda表达式Consumer<String> consumer = (str) -> sop(str);consumer.accept("Hello : XiangYang"); //打印:Hello : XiangYang//方法引用方式consumer = Test06::sop;consumer.accept("Hello : XiangYang"); //打印:Hello : XiangYang}private static void sop(String str) {System.out.println(str);}

 举例三: 3. 类名::实例方法名

	@Testpublic void test7(){//传统Lambda表达式BiPredicate<String,String> biPredicate = (x, y) -> x.equals(y);boolean test = biPredicate.test("hello", "hi");System.out.println(test);//false//方法引用biPredicate = String::equals;test = biPredicate.test("hello", "hello");System.out.println(test);//true}

注意:

方法引用总结:

1.一定弄明白使用方法引用的前提条件(2个)a. 方法引用所引用的方法的参数列表必须要和函数式接口中抽象方法的参数列表相同(完全一致)b .方法引用所引用的方法的的返回值必须要和函数式接口中抽象方法的返回值相同(完全一致)这里使用代码解释一下:@org.junit.Testpublic void test6(){//传统Lambda表达式Consumer<String> consumer = (x) -> System.out.println(x);consumer.accept("Hi: 我是Lambda表达式实现的!"); //打印:Hi: 我是Lambda表达式实现的!//方法引用实现consumer = System.out::println;consumer.accept("Hello : XiangYang,我是使用方法引用实现的 ");//打印:Hello : XiangYang,我是使用方法引用实现的 }解释:1.首先我们看一下Consumer的函数式接口的源码的接口void accept(T t);由于我们给泛型传入的是String类型Consumer<String> consumer = (x) -> System.out.println(x);所以此时//这是函数式接口中抽象方法,接收了实际类型String,没有返回值void accept(T t); ==》 void accept(String t); 2 我们在看我们的Lambda体内的实现	  System.out.println(x);此时,我们查看println方法的源码://这是 方法引用所引用的方法 的参数类型是String,无返回值public void println(String x) {synchronized (this) {print(x);newLine();}}3. 此时函数式的接口中的参数类型与返回值 和	方法引用所引用方法的参数类型与返回值相同,所以可以使用方法引用,类型为: 实例对象名:: 实例方法名 


与匿名类相比, lambda表达式的主要优势在于他们更简洁。

map.merge(key, 1, (count, incr) -> count + incr);

请注意,此代码使用 merge 方法,该方法已添加到 Java 8 中的 Map 接口中。如果没有给定键的映射,则该方法只是插入给定值; 如果映射已经存在,则合并给定函数应用于当前值和给定值,并用结果覆盖当前值。

       从 Java 8 开始,Integer 类(和所有其他包装数字基本类型)提供了一个静态方法总和,和它完全相同。 我们可以简单地传递一个对这个方法的引用,并以较少的视觉混乱得到相同的结果:

map.merge(key, 1, Integer::sum);

如果Lambda太长或者太复杂,方法引用还为我们提供一个解决方案:可以将代码从Lambda表达式中提取到一个新的方法中,并用指向方法的引用来替换这个Lambda表达式。我们可以给这个方法起个好的名字,并将内心的想法写在文档中。

例如,考虑这段代码,它被假定出现在一个名为 GoshThisClassNameIsHumongous 的类中:

service.execute(GoshThisClassNameIsHumongous::action);

  这个 lambda 类似于等价于下面的代码:

service.execute(() -> action());

使用方法引用的代码段并不比使用 lambda 的代码片段更短也不清晰,所以优先选择后者。 

  许多方法引用是指静态方法,但有 4 种方法没有引用静态方法。 其中两个 Lambda 等式是特定(bound)和任意(unbound)对象方法引用。 在特定对象引用中,接收对象在方法引用中指定。 特定对象引用在本质上与静态引用类似:函数对象与引用的方法具有相同的参数。 在任意对象引用中,接收对象在应用函数对象时通过方法的声明参数之前的附加参数指定。 任意对象引用通常用作流管道(pipelines)中的映射和过滤方法(条目 45)。 最后,对于类和数组,有两种构造方法引用。 构造方法引用用作工厂对象。 下表总结了所有五种方法引用:

方法引用类型
Method Ref Type
举例
Example
Lambda 等式
Lambda Equivalent
StaticInteger::parseIntstr -> Integer.parseInt(str)
BoundInstant.now()::isAfterInstant then = Instant.now(); 
t -> then.isAfter(t)
UnboundString::toLowerCasestr -> str.toLowerCase()
Class ConstructorTreeMap<K, V>::new() -> new TreeMap<K, V>
Array Constructorint[]::newlen -> new int[len]

  总而言之,方法引用通常为 lambda 提供一个更简洁的选择。 如果方法引用看起来更简短更清晰,请使用它们;否则,还是坚持 lambda表达式。

所有文章无条件开放,顺手点个赞不为过吧!

                                                        

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据开发电脑千元配置清单

大数据开发电脑配置清单 电脑型号HUANANZHI 台式电脑操作系统Windows 11 专业版 64位&#xff08;Version 23H2 / DirectX 12&#xff09;处理器英特尔 Xeon(至强) E5-2673 v3 2.40GHz主板HUANANZHI X99-P4T&#xff08;P55 芯片组&#xff09;显卡NVIDIA GeForce GT 610 ( 2…

vscode设置特定扩展名文件的打开编码格式

用vscode 编辑c语言或者Verilog代码, 由于其它开发工具的文件编码格式无法修改,默认只能是gb2312, 与我们国内奉行的统一 utf8 不一致. 所以只能是更改特殊文件的打开方式. 配置方式如下. 关键配置如下: {"git.openRepositoryInParentFolders": "never",…

数据结构——广义表

介绍 注&#xff1a;广义表的元素既可以是一个元素&#xff08;原子&#xff09;&#xff0c;也可以又是一个表&#xff08;子表&#xff09;&#xff0c;&#xff08;&#xff09;为原子是空元素&#xff0c;&#xff08;&#xff08;&#xff09;&#xff09;为子表是一个无元…

【计算机网络 - 基础问题】每日 3 题(五十二)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

打开游戏提示丢失(或找不到)XINPUT1_3.DLL的多种解决办法

xinput1_3.dll是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它在Windows操作系统中扮演着重要的角色。该文件作为系统库文件&#xff0c;通常存放于C:\Windows\System32目录下&#xff08;对于32位系统&#xff09;或C:\Windows\SysWOW64目录下&#xff08;对于…

安装vue发生异常: idealTree:nodejs: sill idealTree buildDeps

一、异常 C:\>npm install vue -g npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIREDnpm ERR! request to https://registry.npm.taobao.org/vue failed, reason: certificate has expired 二、原因 请求 https://registry.npm.taobao.org 失败&#xff0c;证…

2024年10月22日练习

一.. 加一 - 力扣&#xff08;LeetCode&#xff09; 这题考虑的麻烦点就在于每位都进位&#xff0c;最后进位扩展一位&#xff0c;此时就要另开空间&#xff0c;用来进位。 其他的情况利用循环从后面往前面走&#xff0c;每一位都判断一下是否变成十&#xff0c;只要变成十&am…

VMamba:视觉SSM

论文标题&#xff1a;VMamba: Visual State Space Model 论文地址&#xff1a;https://arxiv.org/pdf/2401.10166 摘要 VMamba 是一个视觉骨干网络&#xff0c;基于状态空间模型&#xff08;SSM&#xff09;&#xff0c;其复杂度是线性的。该架构的核心是视觉状态空间&#xff…

听泉鉴宝在三个月前已布局商标注册!

近日“听泉鉴宝”以幽默的风格和节目效果迅速涨粉至2500多万&#xff0c;连线出现“馆藏文物”和“盗墓现场”等内容&#xff0c;听泉鉴宝早在几个月前已布局商标注册。 据普推知产商标老杨在商标局网站检索发现&#xff0c;“听泉鉴宝”的主人丁某所持股的江苏灵匠申请了三十…

Java的买家秀探秘:API数据的优雅捕获

在编程世界的某个角落&#xff0c;Java特工正坐在他的高科技办公室里&#xff0c;沉浸在代码的海洋中。今天&#xff0c;他接到了一个有趣的任务&#xff1a;获取买家秀的API数据。这不仅是一次技术的挑战&#xff0c;更是一次深入了解买家心声的机会。Java特工&#xff0c;这位…

宇音天下最新力作 | VTX356语音识别合成芯片问世

北京宇音天下科技有限公司&#xff0c;依托在语音技术领域的丰富经验和技术积累&#xff0c;成功推出了一款具有里程碑意义的语音识别合成芯片——VTX356。这款芯片的问世&#xff0c;不仅彰显了公司在智能语音处理领域的专业实力&#xff0c;也预示着智能家居、车载电子、智能…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十五集:制作更多地图,更多敌人,更多可交互对象

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、第一个代表性场景 1.制作更多敌人2.制作更多可交互对象二、第二个代表性场景 1.制作更多敌人2.制作更多可交互对象三、第三个代表性场景 1.制作更多敌人2.制…

Java生死簿管理小系统(简单实现)

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

pikachu靶场CSRF-post测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、抓包使用burp生成csrf脚本 四、源代码分析 五、结论 一、测试环境 1、系统环境 渗透机&#xff1a;本机(127.0.0.1) 靶 机&#xff1a;本机(127.0.0.1) 2、使用工具/软件 Burp sui…

华为OD机试 - 篮球比赛 - 递归(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

Nginx超简洁知识:负载均衡-反向代理,动静分离,配置文件

首先介绍一下为什么需要nginx&#xff1f; 在低并发场景下&#xff08;也就是用户量特别少的情况下&#xff09;&#xff0c;我们只需要部署一台服务器就能满足用户数量少的需求。 但是如果用户量逐渐增多&#xff0c;只有一台服务器是不够的。于是我们需要部署多台服务器。 …

juzigei/基于Java语言的充电桩系统(充电桩小程序+充电桩管理平台)

简述 SpringBoot 框架&#xff0c;充电桩平台充电桩系统充电平台充电桩互联互通协议云快充协议1.5新能源汽车电动自行车公交车-四轮车充电充电源代码充电平台源码Java源码无加密项目 介绍 云快充协议云快充1.5协议云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充…

长短期记忆网络(Long Short-Term Memory,LSTM)

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 长短期记忆网络&#xff08;Long Short-Term Memory&#xff0c;简称LSTM&#xff09;是一种特殊的循环神经网络&#xff08;Recurrent Neural Network&#xff0c;简称RNN&#xff09;架构&#…

【Qt】Windows下Qt连接DM数据库

环境信息&#xff1a;W11 Qt5.12及以上 dm8 QODBC达梦 Windows环境创建ODBC数据源 使用 ODBC 方法访问 DM 数据库服务器之前&#xff0c;必须先配置 ODBC 数据源 在控制面板Windows工具中显示ODBC数据源管理器 ODBC数据源管理器标签 用户 DSN&#xff1a;添加、删除或配置本…

安达发|氢能源产业与APS生产排程软件的结合

氢能产业&#xff0c;作为一种科技与资本密集型行业&#xff0c;覆盖新材料、电力装备、新能源汽车、航空航天以及国防军工等多个领域&#xff0c;对于推动传统产业的转型升级及新兴产业链的形成具有显著作用。氢能的应用领域广泛&#xff0c;主要可划分为交通、工业、发电和储…