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

 

 

 

posted @ 2021-10-23 18:51  变体精灵  阅读(1853)  评论(0编辑  收藏  举报