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

匿名内部类、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抽象方法的参数与静态方法的参数顺序对应
类型的构造方法引用类::newString::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&#xf…...

研报精选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语言进阶】你听说过柔性数组吗?

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前是C语言学习者 ✈️专栏&#xff1a;C语言航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&a…...

[LeetCode]1237. 找出给定方程的正整数解

题目链接&#xff1a;https://leetcode.cn/problems/find-positive-integer-solution-for-a-given-equation/description/ 题目描述&#xff1a; 样例1&#xff1a; 输入&#xff1a;function_id 1, z 5 输出&#xff1a;[[1,4],[2,3],[3,2],[4,1]] 解释&#xff1a;functi…...

【路径规划】基于A*算法和Dijkstra算法的路径规划(Python代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…...

蓝桥杯 stm32 PWM 设置占空比

本文代码使用 HAL 库。 文章目录 前言一、创建CubeMX 工程 ,占空比分析:二、相关函数:1. 获取 CNT函数2.设置CNT为 0 函数(计算器清零)3.开启TIM2_CH1的输入捕获中断函数4.TIM 回调函数三、设置上升沿,下降沿四、在lcd上显示 R40 占空比 详细代码五、设置占空比,输出 PW…...

React 合成事件理解

1 事件三个阶段 捕获、目标、处理 &#xff08;具体百度&#xff0c;后面有空补全&#xff09;2import React from "react";class Test extends React.Component {parentRef;childRef;constructor(props) {super(props);this.parentRef React.createRef();this.chil…...

202302|读书笔记——国图点滴

杂志剪影|看一本赚一本系列 anywhere 随心而行随心而动&#xff0c;极简相生复古文艺 热情洋溢 色彩斑斓 极致优雅 深邃魅力 新生绽放 灿若星空 异彩纷呈含苞待放 惊艳绽放 爱在云端 空中婚礼 暗夜浪漫 策马逐梦橘影相映 浆果红唇 梦幻无暇 永无止境浮光掠影 微酥清风低调奢华…...

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 你好&#xff0c;窗口LearnOpenGL 笔记 - 入门 04 你好&#xff0c;三角形 文章目录系列文章目录1. 前言2. 渲染管线的入口 - 顶点着色器2.1 顶点着色器处理过…...

Linux中sed的使用

语法&#xff1a; sed [选项] [sed内置命令字符] [输入文件]选项&#xff1a; 参数说明-n取消默认色的输出常与sed内置命令p一起使用-i直接将修改结果写入文件&#xff0c;不用-i&#xff0c;sed修改的是内存数据-e多次编译&#xff0c;不需要管道符了-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&#xff0c;网络提供商/运营商&#xff0c;如电信、联通、移动等。 1. 与ISP互联的出口带宽 IDC或云提供商会与各运营商互联&#xff0c;互联的具体带宽数值一旦泄露&#xff0c;就会被恶意的攻击者利用。例如&#xff0c;若DDos攻击者知道了被攻击…...

vTESTstudio - VT System CAPL Functions - VT2004(续1)

成熟,就是某一个突如其来的时刻,把你的骄傲狠狠的踩到地上,任其开成花或者烂成泥。vtsStartStimulation - 启动激励输出功能&#xff1a;自动激励输出注意&#xff1a;在启动激励输出之前&#xff0c;一定要设置好输出模式Target&#xff1a;目标通道变量空间名称&#xff0c;例…...

WeakMap弱引用

let obj{name:张三} //{name:张三}这个对象能够被读取到&#xff0c;因为obj这个变量名对它的引用 ​ //将引用覆盖掉 objnull //这个对象将会被从内存中移除&#xff0c;因为我们已经失去了对他的所有引用 let obj{name:张三} let arr[obj] ​ objnull //对象{name:张三}不会…...

Springboot 使用quartz 定时任务 增删改查

前段时间公司项目用到了 定时任务 所以写了一篇定时任务的文章 &#xff0c;浏览量还不错 &#xff0c; Springboot 整合定时任务 ) 所以就准备写第二篇&#xff0c; 如果你是一名Java工程师&#xff0c;你也可以会看到如下的页面 &#xff0c;去添加定时任务 定时任务展示 :…...

华为OD机试 - 猜字谜(Python) | 机试题+算法思路 【2023】

最近更新的博客 华为OD机试 - 热点网络统计 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试 - 查找单入口空闲区域 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试 - 好朋友 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试 - 找出同班小朋友 | 备考思路,刷题要点…...

Linux常用命令汇总

1、tcpdump抓包 tcpdump这个命令是用来抓包的&#xff0c;默认情况下这个命令是没有的&#xff0c;需要安装一下&#xff1a; yum install -y tcpdump 使用这个命令的时候最好是加上你网卡的名称&#xff0c;不然可能使用不了&#xff1a; tcpdump -nn -i {网卡名称} 网卡名称…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...

js 设置3秒后执行

如何在JavaScript中延迟3秒执行操作 在JavaScript中&#xff0c;要设置一个操作在指定延迟后&#xff08;例如3秒&#xff09;执行&#xff0c;可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法&#xff0c;它接受两个参数&#xff1a; 要执行的函数&…...