java拉姆达表达式原理_Lambda表达式运行原理

JDK8引入了Lambda表达式以后,对我们写代码提供了很大的便利,那么Lambda表达式是如何运用简单表示来达到运行效果的呢?今天,我们通过一个例子来学习下Lambda表达式的底层运行原理!

一、创建测试样例

首先:我们创建一个测试类App.java,在它内部新建一个函数式接口Lam.java,只有一个抽象方法print(),作用是将传入的消息加工后再输出。

然后:我们在测试类App.java中进行lambda表达式的创建测试。

代码如下:

public class App {

public static void main(String[] args) {

Lam lam = (msg) -> "log:" + msg;

String result = lam.print("Test");

System.out.println(result);

}

}

interface Lam {

String print(String msg);

}

二、利用Java命令编译分析

首先,我们进行javac命令的编译,会生成两个class文件:

javac App.java

29bfe8ae868b4fcbd1d7a4d3a468fcd8.png

然后,我们通过javap -p命令打开Lam.class:

javap -p Lam.class

e1f8bd83b448f8067d0d52265d78b7d8.png

从图中我们可以看到,因为Lam.class是App.class的内部类,所以提示我们它是App.java编译过来的,并且其内部只有一个abstract方法print()。

接下来,我们再打开App.class:

javap -p App.class

a58f19d373fed34982063ef5a73eaa84.png

App.class中一共有三个方法,一个默认构造方法,一个main方法,还多了一个我们没有定义过的方法:lambda$main$0(String),很明显,这个方法就是lambda表达式内逻辑操作方法,它是一个static的方法,入参就是我们传入的msg类型String。

那么,这个lambda$main$0(String)方法是怎么被调用的呢?我们通过对java命令指定选项查看底层详细的编译过程:

java -Djdk.internal.lambda.dumpProxyClasses App

a3d9b670ef29fc634335e0109082495c.png

我们能够看到多出来一个App$$Lambda$1.class文件,打开文件:

javap -p App$$Lambda$1.class

d0f72bf034765e0dc8647bc1984c4646.png

我们看到,这个类是一个实现Lam接口的final类,它内部实现了print()方法。

我们再通过javap -c查看一下它内部详细信息:

javap -c App$$Lambda$1.class

7a285c5eb710bfd353c03a736f49a183.png

由此我们可以看出,App$$Lambda\(1.class的print()方法执行了App.lambda\)main$0(),因此,我们就可以得出结论:

Java在编译时,首先,在App内将Lambda表达式抽取出来作为一个static方法lambda$main$0(String);

然后,对Lam.class做了默认实现App$$Lambda$1.class,并在内部print()方法中调用了App内的static方法:lambda$main$0();

接下来,执行App的main()方法时,就会对lambda表达式利用实现类的print()方法运行;

最后,将结果返回,并打印。

这就是Lambda表达式的底层运行逻辑。

三、文末

以上,就是我们通过一个实例,运用Java命令,来理解Lambda表达式的底层运行原理的全部内容,希望对你有所帮助!

O(∩_∩)O

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值