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、匿名内部类中调用生成的 私有静态 方法

 

 

 

posted @   变体精灵  阅读(1922)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示