Lambda 表达式简介
一、什么是 Lambda 表达式
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性,Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中).使用 Lambda 表达式可以使代码变的更加简洁紧凑
二、使用 Lambda 有什么好处
开启线程执行任务调度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class LambdaDemo { public static void main(String[] args) { // 方式一、使用匿名内部类 Thread thread = new Thread( new Runnable() { @Override public void run() { System.out.println( "开启线程执行任务调度..." ); } }); // 方式二、使用 lambda 表达式 Thread therad2 = new Thread(() -> System.out.println( "开启线程执行任务调度..." )); } } |
可以从上面的例子中看出,相比于使用匿名内部类,Lambda 表达式更加简洁
三、Lambda 表达式语法格式
1 2 3 4 5 | (参数类型 1 参数 1 ,参数类型 2 参数 2 ) -> { 语句 1 ; 语句 2 ; [ return 语句]; } |
1、参数类型可写可不写,一般情况下是不写的,Lambda 会根据上下文去推断参数类型
2、只有一个参数的情况下,() 可以省略不写
3、Lambda 体中只有一条语句时,{}、return、; 可以省略不写,注意在省略的时候要么全部不写,要么全部要写,不能部分省略
4、Lambda 体中有多条语句时,{} 必须要加上,如果有返回值 return 也必须加上
四、函数型接口
使用 Lambda 表达式的前提是需要函数型接口的支持,至于什么是函数型接口可以参考如下文档
https://www.cnblogs.com/xiaomaomao/p/16459354.html
五、匿名内部类、Lambda 表达式原理
1、匿名内部类原理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // 自定义接口 interface Flyable { void fly(String userName); } public class LambdaDemo { public static void main(String[] args) { LambdaDemo lambdaDemo = new LambdaDemo(); lambdaDemo.flying( new Flyable() { @Override public void fly(String userName) { System.out.println(userName + " want to fly" ); } }); } public void flying(Flyable flyable) { flyable.fly( "summer" ); } } |
上面是通过匿名内部类实现的代码,实际上匿名内部类会在编译期产生一个中间类,该中间类的伪代码如下
1 2 3 4 5 6 | // LambdaDemo$1 是编译期产生的中间类名称,LambdaDemo 是类名,$1 是第 1 个 class LambdaDemo$ 1 implements Flyable{ public void fly(String userName) { System.out.println(userName + " want to fly" ); } } |
通过 IDEA debug 可以找到该中间类
2、Lambda 表达式原理(实现伪代码)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class LambdaDemo { public static void main(String[] args) { LambdaDemo lambdaDemo = new LambdaDemo(); lambdaDemo.flying( new Flyable() { @Override public void fly(String userName) { // 匿名内部类中调用生成的 私有静态 方法 LambdaDemo.lambda$main$ 0 (userName); } }); } // Lambda 表达式在运行期会生成一个 私有的静态方法,该方法的实现就是 Lambda 体的内容 private static void lambda$main$ 0 (String userName) { System.out.println(userName + " want to fly" ); } public void flying(Flyable flyable) { flyable.fly( "summer" ); } } |
Lambda 表达式实现原理
1、在本类中生成一个 私有静态 方法,该方法的内容就是 Lambda 体中的内容
2、匿名内部类中调用生成的 私有静态 方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?