匿名内部类、Lambda表达式、方法引用对比分析
文章目录
- 一、匿名内部类
- 1. 语法格式
- 2. 使用方法
- ① 传统方式
- ② 匿名内部类方式
- 二、Lambda表达式
- 1. 语法格式
- 2. 使用方法
- ① 匿名内部类方式
- ② Lambda表达式方式
- 三、方法引用
- 1. 语法格式
- 2. 使用方法
- ① 类型的静态方法引用
- ② 类型的构造方法引用
- ③ 类型的实例方法引用
- ④ 对象的实例方法引用
- 四、匿名内部类、Lambda表达式、方法引用对比分析总结
一、匿名内部类
匿名内部类可以看作是特殊的局部内部类,其本质就是一个继承类(或实现接口)的匿名子类。
匿名内部类是在使用的时候动态的指定方法体的逻辑,无需每次都去创建一个继承类(或实现接口)的子类。编译器会在编译阶段自动生成一个匿名子类。
1. 语法格式
匿名内部类的语法格式:new 接口名|类名(){重写方法}
其中,如果重写方法为非必要的,原则上是可以没有重写方法部分的。
2. 使用方法
① 传统方式
父子类:
public class ParentClass {public void aa(String str) {}public void bb(String str) {}
}
public class ChildClass extends ParentClass {@Overridepublic void aa(String str) {System.out.println("自定义方法体");}@Overridepublic void bb(String str) {System.out.println("自定义方法体");}
}
public class Test {public static void main(String[] args) {ParentClass ohj = new ChildClass();}
}
接口实现类:
public interface ParentInterface {void aa(String str);void bb(String str);
}
public class ChildClass implements ParentInterface {@Overridepublic void aa(String str) {System.out.println("自定义方法体");}@Overridepublic void bb(String str) {System.out.println("自定义方法体");}
}
public class Test {public static void main(String[] args) {ParentInterface ohj = new ChildClass();}
}
② 匿名内部类方式
父子类:
public class ParentClass {public void aa(String str) {}public void bb(String str) {}
}
public class Test {public static void main(String[] args) {ParentClass obj = new ParentClass() {@Overridepublic void aa() {System.out.println("自定义方法体");}@Overridepublic void bb() {System.out.println("自定义方法体");}};}
}
接口实现类:
public interface ParentInterface {void aa(String str);void bb(String str);
}
public class Test {public static void main(String[] args) {ParentInterface obj = new ParentInterface() {@Overridepublic void aa() {System.out.println("自定义方法体");}@Overridepublic void bb() {System.out.println("自定义方法体");}};}
}
二、Lambda表达式
从Java8开始,引入了Lambda表达式。
对于只有一个抽象方法的接口(函数式接口),可以直接使用Lambda表达式创建它的匿名实现类实例。
- 使用匿名内部类方式定义的内部类:编译之后,会生成一个单独的class字节码文件(外部类名$编号.class);
- 使用Lambda表达式定义的内部类:编译之后,不会生成一个单独的class字节码文件,对应的字节码会在运行的时候动态生成。
1. 语法格式
Lambda表达式的语法格式:(参数列表) -> {方法体}
省略写法:
- 小括号内参数的参数类型可以省略
- 小括号内无参数时,小括号不可省略
- 小括号内只有一个参数时,小括号可以省略
- 小括号内有多个参数时,小括号不可省略
- 大括号内有且只有一行语句时,可以省略
2. 使用方法
public interface ParentInterface {void aa(String str);
}
① 匿名内部类方式
public class Test {public static void main(String[] args) {ParentInterface obj = new ParentInterface() {@Overridepublic void aa(String str) {System.out.println("自定义方法体");}};}
}
② Lambda表达式方式
public class Test {public static void main(String[] args) {ParentInterface obj = str -> System.out.println("自定义方法体");}
}
三、方法引用
方法引用是对Lambda表达式进一步简化,借用其他类的方法体,省去了写方法体的过程。
对于方法体只有一行代码的Lambda表达式(该行代码为调用某个类或某个实例的方法时),可以简洁为更简单的方法引用的方式。
1. 语法格式
方法引用的语法格式:
| 语法种类 | 语法格式 | 示例 | 参数对应关系 |
|---|---|---|---|
| 类型的静态方法引用 | 类::静态方法 | String::valueOf | 抽象方法的参数与静态方法的参数顺序对应 |
| 类型的构造方法引用 | 类::new | String::new | 抽象方法的参数与构造方法的参数顺序对应 |
| 类型的实例方法引用 | 类::实例方法 | String::replaceAll | 抽象方法的第一个参数为调用引用方法的实例对象 抽象方法的剩余参数与实例方法的参数顺序对应 |
| 对象的实例方法引用 | 对象::实例方法 | s::replaceAll | 实例对象s为外部参数 抽象方法的参数与实例方法的参数顺序对应 |
需要注意:
- 当接口的抽象方法无返回值时,方法引用的方法有无返回值都可以;
- 当接口的抽象方法有返回值时,方法引用的方法也必须有返回值,且返回值类型 instanceof 接口的抽象方法返回值类型
2. 使用方法
① 类型的静态方法引用
类型的静态方法引用:类名::静态方法
对应Lambda表达式:(参数1,参数2,…) -> 类名.静态方法(参数1,参数2,…)
@FunctionalInterface
public interface ParentInterface {String aa(String s);
}
public class Test {public static void main(String[] args) {// 类型的静态方法引用ParentInterface parentInterface1 = String::valueOf;// 对应Lambda表达式方式ParentInterface parentInterface2 = s -> String.valueOf(s);}
}
② 类型的构造方法引用
类型的构造方法引用:类::new
对应Lambda表达式:(参数1,参数2,…) -> new 类名(参数1,参数2,…)
@FunctionalInterface
public interface ParentInterface {String aa(String s);
}
public class Test {public static void main(String[] args) {// 类型的构造方法引用ParentInterface parentInterface1 = String::new;// 对应Lambda表达式方式ParentInterface parentInterface2 = s -> new String(s);}
}
③ 类型的实例方法引用
类型的实例方法引用:类::实例方法
对应Lambda表达式:(参数1,参数2,…) -> 参数1.静态方法(参数2,…)
@FunctionalInterface
public interface ParentInterface {String aa(String s1, String s2, String s3);
}
public class Test {public static void main(String[] args) {// 类型的实例方法引用ParentInterface parentInterface1 = String::replaceAll;// 对应Lambda表达式方式ParentInterface parentInterface2 = (s1,s2,s3) -> s1.replaceAll(s2,s3);}
}
④ 对象的实例方法引用
对象的实例方法引用:对象::实例方法
对应Lambda表达式:(参数1,参数2,…) -> 对象.静态方法(参数1,参数2,…)
@FunctionalInterface
public interface ParentInterface {String aa(String s1, String s2);
}
public class Test {public static void main(String[] args) {String s = "";// 对象的实例方法引用ParentInterface parentInterface1 = s::replaceAll;// 对应Lambda表达式方式ParentInterface parentInterface2 = (s1,s2) -> s.replaceAll(s1,s2);}
}
四、匿名内部类、Lambda表达式、方法引用对比分析总结
- Lambda表达式是匿名内部类的简写(匿名内部类为函数式接口的实现的这种)
- 方法引用是Lambda表达式的简写(Lambda表达式的方法体只有一行代码且该行代码方法调用)
相关文章:
匿名内部类、Lambda表达式、方法引用对比分析
文章目录一、匿名内部类1. 语法格式2. 使用方法① 传统方式② 匿名内部类方式二、Lambda表达式1. 语法格式2. 使用方法① 匿名内部类方式② Lambda表达式方式三、方法引用1. 语法格式2. 使用方法① 类型的静态方法引用② 类型的构造方法引用③ 类型的实例方法引用④ 对象的实例…...
ESXi主机CVE-2021-21972漏洞复现安全处置建议
一、漏洞简介 vSphere 是 VMware 推出的虚拟化平台套件,包含 ESXi、vCenter Server 等一系列的软件。其中 vCenter Server 为 ESXi 的控制中心,可从单一控制点统一管理数据中心的所有 vSphere 主机和虚拟机。 vSphere Client(HTML5…...
研报精选230217
目录 【行业230217毕马威】奢侈品行业新气象【行业230217国信证券】医药生物行业2023年2月投资策略:持续关注疫后复苏和创新两大主线【行业230217国金证券】航空锻造:稳定格局筑专业化壁垒,顺势而为拓产业链深度【个股230217西南证券_招商轮船…...
c++11 标准模板(STL)(std::unordered_set)(一)
定义于头文件 <unordered_set> template< class Key, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator<Key> > class unordered_set;(1)(C11 起)namespace pmr { templ…...
【C语言进阶】你听说过柔性数组吗?
👦个人主页:Weraphael ✍🏻作者简介:目前是C语言学习者 ✈️专栏:C语言航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&a…...
[LeetCode]1237. 找出给定方程的正整数解
题目链接:https://leetcode.cn/problems/find-positive-integer-solution-for-a-given-equation/description/ 题目描述: 样例1: 输入:function_id 1, z 5 输出:[[1,4],[2,3],[3,2],[4,1]] 解释:functi…...
【路径规划】基于A*算法和Dijkstra算法的路径规划(Python代码实现)
👨🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…...
蓝桥杯 stm32 PWM 设置占空比
本文代码使用 HAL 库。 文章目录 前言一、创建CubeMX 工程 ,占空比分析:二、相关函数:1. 获取 CNT函数2.设置CNT为 0 函数(计算器清零)3.开启TIM2_CH1的输入捕获中断函数4.TIM 回调函数三、设置上升沿,下降沿四、在lcd上显示 R40 占空比 详细代码五、设置占空比,输出 PW…...
React 合成事件理解
1 事件三个阶段 捕获、目标、处理 (具体百度,后面有空补全)2import React from "react";class Test extends React.Component {parentRef;childRef;constructor(props) {super(props);this.parentRef React.createRef();this.chil…...
202302|读书笔记——国图点滴
杂志剪影|看一本赚一本系列 anywhere 随心而行随心而动,极简相生复古文艺 热情洋溢 色彩斑斓 极致优雅 深邃魅力 新生绽放 灿若星空 异彩纷呈含苞待放 惊艳绽放 爱在云端 空中婚礼 暗夜浪漫 策马逐梦橘影相映 浆果红唇 梦幻无暇 永无止境浮光掠影 微酥清风低调奢华…...
Linux 操作系统原理 — NUMA 架构中的多线程调度开销与性能优化
目录 文章目录 目录前言NUMA 架构中的多线程性能开销1、跨 Node 的 Memory 访问开销2、跨 Core 的多线程 Cache 同步开销3、多线程上下文切换开销4、多线程模式切换开销5、中断处理的开销6、TLB 缓存失效的开销7、内存拷贝的开销NUMA 架构中的性能优化:使用多核编程代替多线程…...
OpenGL - 如何理解 VAO 与 VBO 之间的关系
系列文章目录 LearnOpenGL 笔记 - 入门 01 OpenGLLearnOpenGL 笔记 - 入门 02 创建窗口LearnOpenGL 笔记 - 入门 03 你好,窗口LearnOpenGL 笔记 - 入门 04 你好,三角形 文章目录系列文章目录1. 前言2. 渲染管线的入口 - 顶点着色器2.1 顶点着色器处理过…...
Linux中sed的使用
语法: sed [选项] [sed内置命令字符] [输入文件]选项: 参数说明-n取消默认色的输出常与sed内置命令p一起使用-i直接将修改结果写入文件,不用-i,sed修改的是内存数据-e多次编译,不需要管道符了-r支持正则扩展 sed的内…...
[软件工程导论(第六版)]第1章 软件工程学概述(复习笔记)
文章目录1.1 软件危机1.1.1 软件危机的介绍1.1.2 产生软件危机的原因1.1.3 消除软件危机的途径1.2 软件工程1.2.1 软件工程的介绍1.2.2 软件工程的基本原理1.2.3 软件工程方法学1.3 软件生命周期组成1.4 软件过程概念1.4.1 瀑布模型1.4.2 快速原型模型1.4.3 增量模型1.4.4 螺旋…...
ISP相关
Internet Service Provider,网络提供商/运营商,如电信、联通、移动等。 1. 与ISP互联的出口带宽 IDC或云提供商会与各运营商互联,互联的具体带宽数值一旦泄露,就会被恶意的攻击者利用。例如,若DDos攻击者知道了被攻击…...
vTESTstudio - VT System CAPL Functions - VT2004(续1)
成熟,就是某一个突如其来的时刻,把你的骄傲狠狠的踩到地上,任其开成花或者烂成泥。vtsStartStimulation - 启动激励输出功能:自动激励输出注意:在启动激励输出之前,一定要设置好输出模式Target:目标通道变量空间名称,例…...
WeakMap弱引用
let obj{name:张三} //{name:张三}这个对象能够被读取到,因为obj这个变量名对它的引用 //将引用覆盖掉 objnull //这个对象将会被从内存中移除,因为我们已经失去了对他的所有引用 let obj{name:张三} let arr[obj] objnull //对象{name:张三}不会…...
Springboot 使用quartz 定时任务 增删改查
前段时间公司项目用到了 定时任务 所以写了一篇定时任务的文章 ,浏览量还不错 , Springboot 整合定时任务 ) 所以就准备写第二篇, 如果你是一名Java工程师,你也可以会看到如下的页面 ,去添加定时任务 定时任务展示 :…...
华为OD机试 - 猜字谜(Python) | 机试题+算法思路 【2023】
最近更新的博客 华为OD机试 - 热点网络统计 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试 - 查找单入口空闲区域 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试 - 好朋友 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试 - 找出同班小朋友 | 备考思路,刷题要点…...
Linux常用命令汇总
1、tcpdump抓包 tcpdump这个命令是用来抓包的,默认情况下这个命令是没有的,需要安装一下: yum install -y tcpdump 使用这个命令的时候最好是加上你网卡的名称,不然可能使用不了: tcpdump -nn -i {网卡名称} 网卡名称…...
OZON跨境电商的供应链之痛:爆单AI选品后为什么你拿货比别人贵?
选品决定利润的上限,供应链决定利润的下限做跨境电商,有一个残酷的事实:同样的商品,你卖100块,利润20块。别人卖90块,利润还有25块。为什么?不是你卖得不好,不是你运营不行ÿ…...
Mac/Win/Linux全平台实测:用Ollama一键部署DeepSeek-R1 7B模型,附硬件配置建议
Mac/Win/Linux全平台实测:用Ollama一键部署DeepSeek-R1 7B模型,附硬件配置建议 去年在帮创业团队搭建本地AI开发环境时,我试遍了市面上所有开源模型部署方案。当Ollama首次支持DeepSeek-R1时,其跨平台兼容性让我眼前一亮——同一套…...
VOOHU 沃虎电子 千兆PoE+集成式RJ45连接器 SYT411Q199DB2A1DP 内置网络变压器 支持720mA供电 适用于PoE交换机与无线AP
苏州沃虎电子科技有限公司(品牌:VOOHU)供应的 SYT411Q199DB2A1DP 是一款高性能千兆集成式RJ45连接器,内置符合IEEE 802.3at标准的网络变压器,支持PoE(高达720mA)供电。该产品采用90侧插DIP封装&…...
1771-OZL处理器模块
1771-OZL 处理器模块 — 产品特点1771-OZL 是1771系列的PLC处理器模块,用于工业自动化系统的逻辑运算与过程控制。适用于PLC-5标准机架控制系统支持数字量输入/输出及模拟量接口内置高速逻辑运算功能可执行顺序控制和定时/计数功能支持程序存储与在线修改高可靠性设…...
从‘Hello World’到视频监控:用QT+海康SDK开发你的第一个安防应用
从‘Hello World’到视频监控:用QT海康SDK开发你的第一个安防应用 第一次看到海康威视摄像头的实时画面在自己的程序里跳出来时,那种成就感比写一百个"Hello World"都来得强烈。作为一位刚接触QT的开发者,你可能已经厌倦了按钮和文…...
5G赋能下的车联网协同感知:自动驾驶感知盲区消除新思路
1. 为什么自动驾驶需要"组队开黑"模式? 想象一下你开车经过一个十字路口,左侧突然冲出一辆外卖电动车——这是典型的A柱盲区问题。传统自动驾驶就像闭着眼睛打游戏,全靠本车传感器"听声辨位"。而5G车联网协同感知&#x…...
Spark--一文了解SparkSql的Join策略
文章目录前言一、join 基本要素二、join 实现三、五种join 策略3.1 2 种数据分发模式(数据怎么到同一个节点)3.1.1 Broadcast Join(广播 Join,也叫 Map Join)3.1.2 Shuffle Join(重分区 Join,也…...
League-Toolkit:基于LCU API的英雄联盟智能辅助工具
League-Toolkit:基于LCU API的英雄联盟智能辅助工具 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在快节奏的MOBA游…...
游戏资源解密工具:RPG Maker Decrypter零基础使用指南
游戏资源解密工具:RPG Maker Decrypter零基础使用指南 【免费下载链接】RPGMakerDecrypter Tool for extracting RPG Maker XP, VX and VX Ace encrypted archives. 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerDecrypter RPG Maker Decrypter 是一…...
OpenClaw+Qwen3-32B双镜像方案:AI写作与发布自动化流水线
OpenClawQwen3-32B双镜像方案:AI写作与发布自动化流水线 1. 为什么需要双镜像协作? 去年冬天,当我第一次尝试用AI自动化完成技术博客的写作和发布时,遇到了一个典型困境:本地模型响应快但质量一般,云端大…...
