当前位置: 首页 > news >正文

java之方法引用 —— ::

目录

一、简介

二、引用静态方法 

1.格式 

 2.示例

​编辑

3.条件解析 

 三、引用成员方法

1.格式 

2.示例 

四、引用构造方法 

1.格式 

2.示例

五、类名引用成员方法

1.格式

2.略微不同的方法引用规则

 3.示例

六、引用数组的构造方法 

1.格式

2.示例


一、简介

方法引用就是,把已有的方法拿过来,当作函数式中抽象方法的方法体。

为什么要使用方法引用? 

在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿参数做操作

那么考虑一种情况:如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,那是否还有必要再写重复逻辑呢?答案肯定是没有必要

那我们又是如何使用已经存在的方案的呢?

这就是方法引用的用处了,我们通过方法引用来使用已经存在的方案。

下面示例更能明白方法引用的好处: 

上面示例 ,使用匿名内部类和lambda表达式的方法必须重新实现方法,但是方法引用可以用类实现好的方法拿来使用。

但是这些方法能被拿来方法引用是有条件的(适用二、三、四、六):

1.引用处需要是函数式接口

2.被引用的方法需要已经存在

3.被引用方法的形参和返回值需要跟抽象方法的形参和返回值保持一致

4.被引用方法的功能需要满足当前的要求

刚才的示例代码用到方法引用的地方就是函数式接口的地方,即Arrays类的sort方法的第二个参数comparator,这个参数是一个函数式接口,底层代码如下:

什么是函数式接口?函数式接口就是一个接口,而且这个接口只有一个抽象方法 。

可以被隐式地转换为一个 lambda 表达式或方法引用。这样的接口使得函数式编程在 Java 中成为可能,尤其是在使用 Java 8 引入的流(Stream)和 lambda 表达式时。

在 Java 中,可以通过 @FunctionalInterface 注解来明确标识一个接口为函数式接口。尽管这个注解是可选的,但使用它可以帮助编译器检查该接口是否符合函数式接口的规范。

二、引用静态方法 

1.格式 

类名::方法名

范例:Integer::parseInt

注意   :: 该符号为引用运算符,而它所在的表达式被称为方法引用

 2.示例

将集合里面的字符串转化为数字

3.条件解析 

 下面是Stream接口的抽象方法map,参数是一个Function接口

 Function接口这个参数是函数式接口,底层如下。满足第一个条件,方法引入的地方为函数式接口FunctionalInterface

 下面是Integer类的静态方法parseInt,返回类型和参数值满足方法有内容实现,刚好满足字符串转数字的功能需求。到这里就满足方法引用的后面三个条件。

 三、引用成员方法

1.格式 

对象::成员方法名 

 

注意在静态方法里面比 (如main) 不能用this、super

2.示例 

注意:main方法里面是禁止使用this、super的

四、引用构造方法 

1.格式 

类名::new

范例:Student::new

作用:创建一个对象

2.示例

准备好一个Student类

用引用构造方法的方式将字符串转换出对象

五、类名引用成员方法

1.格式

类名::方法名

范例:String::toUpperCase()

2.略微不同的方法引用规则

前面只有静态方法才能使用类名::方法名,普通方法也要这样用就必须遵守下面的规则。与原规则不同的地方在于形参。

新规则:

 上面的规则说到了抽象方法的第二个形参到最后一个,被引用的方法必须一样。那么抽象方法的第一个参数呢?

抽象方法的第一个参数其实就是我们要用的方法引用的方法所在的类,就是::前面的类名,用官方的话来说就是--被引用方法的调用者。一般是流中的每一个数据的数据类型。

还有一个问题就是,如果抽象方法的第二个参数是空的呢?

抽象方法的第二个参数是空的,表示被引用方法是无参的。

局限性:因为有抽象方法的形参限制,并不是所有的普通方法都能引用。 

 3.示例

需求:将集合中的字符串小写转大写

下面是map的形参即函数式接口,它的抽象方法只有一个参数,所以只能引用无参的方法,流的数据类型是String,所以选用String的无参方法。

下面左边是匿名内部类的写法,右边是String类的无参方法toUpperCase将小写字母转大写,满足功能需求。返回值由被引用的方法决定。

六、引用数组的构造方法 

1.格式

数据类型[ ]::new

范例:int[ ]::new

注意:数组中的数据必须跟流中的数据一样

2.示例

函数式接口的抽象方法 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • c语言第七天笔记
  • IPython的魔法:深入探索%%pastebin命令的奥秘
  • Python切片的用法
  • STM32DMA数据传输
  • Golang之OpenGL(一)
  • 平舌、翘舌音学习: z、c、s--zh、ch、sh
  • 使用 MinIO、Langchain 和 Ray Data 构建分布式嵌入式子系统
  • electron-builder打包vue2项目问题合集
  • Java | Leetcode Java题解之第316题去除重复字母
  • MongoDB简介及其在Java中的应用
  • 大语言模型(LLM)快速理解
  • 记录一次服务器被(crontab)木马入侵事件
  • 【Nuxt】服务端渲染 SSR
  • [Meachines] [Easy] Mirai Raspberry树莓派默认用户登录+USB挂载文件读取
  • 栈和队列——2.逆波兰表达式求值
  • go语言学习初探(一)
  • IP路由与转发
  • Java小白进阶笔记(3)-初级面向对象
  • MaxCompute访问TableStore(OTS) 数据
  • MobX
  • React Native移动开发实战-3-实现页面间的数据传递
  • 第2章 网络文档
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 每天一个设计模式之命令模式
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 设计模式走一遍---观察者模式
  • 算法---两个栈实现一个队列
  • 网页视频流m3u8/ts视频下载
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 容器镜像
  • (12)目标检测_SSD基于pytorch搭建代码
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Git) gitignore基础使用
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (十二)springboot实战——SSE服务推送事件案例实现
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net反编译工具
  • .skip() 和 .only() 的使用
  • ??myeclipse+tomcat
  • @Autowired和@Resource的区别