Lambda 表达式简介
一、什么是 Lambda 表达式
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性,Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中).使用 Lambda 表达式可以使代码变的更加简洁紧凑
二、使用 Lambda 有什么好处
开启线程执行任务调度
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 参数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、匿名内部类原理
// 自定义接口
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");
}
}
上面是通过匿名内部类实现的代码,实际上匿名内部类会在编译期产生一个中间类,该中间类的伪代码如下
// 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 表达式原理(实现伪代码)
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、匿名内部类中调用生成的 私有静态 方法