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

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

javap -p Lam.class

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

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

javap -p App.class

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

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

java -Djdk.internal.lambda.dumpProxyClasses App

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

javap -p App$$Lambda$1.class

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

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

javap -c App$$Lambda$1.class

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

  1. Java在编译时,首先,在App内将Lambda表达式抽取出来作为一个static方法lambda$main$0(String)
  2. 然后,对Lam.class做了默认实现App$$Lambda$1.class,并在内部print()方法中调用了App内的static方法:lambda$main$0()
  3. 接下来,执行App的main()方法时,就会对lambda表达式利用实现类的print()方法运行;
  4. 最后,将结果返回,并打印。

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

三、文末

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

O(∩_∩)O

Lambda表达式运行原理的更多相关文章

  1. 深入探究JVM之方法调用及Lambda表达式实现原理

    @ 目录 前言 正文 解析 分派 静态分派 动态分派 单分派和多分派 动态分派的实现 Lambda表达式的实现原理 MethodHandle 总结 前言 在最开始讲解JVM内存结构的时候有简单分析过方 ...

  2. Java基础进阶:内部类lambda重点摘要,详细讲解成员内部类,局部内部类,匿名内部类,Lambda表达式,Lambda表达式和匿名内部类的区别,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    内部类lambda重点摘要 内部类特点: 内部类可以直接访问外部类,包括私有 外部类访问内部类必须创建对象 创建内部对象格式: 外部类.内部类 对象名=new外部类().new内部类(); 静态内部类 ...

  3. 17.继承 and18.接口和多态 内部类 匿名内部类,Lambda表达式

    1. 继承 1.1 继承的实现(掌握) 继承的概念 继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法 实现继承的格式 继承通过extends实现 ...

  4. 作为有经验的程序员如果不懂Lambda表达式就说不过去了吧,建议收藏!!!

      最近刚好有空给大家整理下JDK8的特性,这个在实际开发中的作用也是越来越重了,本文重点讲解下Lambda表达式 Lambda表达式   Lambda 表达式,也可称为闭包,它是推动 Java 8 ...

  5. JDK中Lambda表达式的序列化与SerializedLambda的巧妙使用

    前提 笔者在下班空余时间想以Javassist为核心基于JDBC写一套摒弃反射调用的轻量级的ORM框架,过程中有研读mybatis.tk-mapper.mybatis-plus和spring-boot ...

  6. Java Lambda表达式初探

    Java Lambda表达式初探 前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用 ...

  7. Lambda表达式之Python

    一.lambda函数 1.lambda函数基础: lambda函数也叫匿名函数,即,函数没有具体的名称,而用def创建的方法是有名称的.如下: """命名的foo函数&q ...

  8. python之lambda表达式

    lambda函数小结 1.lambda表达式: 以前看人家写一个长式子就能干一件我写一个函数干的事情觉得好帅,现在通过学习知道了lambda表达式其原理就是一个函数,而且是一个只能处理简单功能的函数. ...

  9. Python基础-Python的三元运算符和lambda表达式

    1. Python的三元表达式: 现在大部分高级语言都支持 “?”这个三元运算符,它对应的表达式如下:condition ? value if true:value if else 但是 Python ...

随机推荐

  1. jira仪表盘的建立与共享

    一般在项目测试阶段,可以通过jira仪表盘清晰的展示bug的各个状态的数量,各个开发人员的bug数量. 有效督促开发解决问题. 也为测试日报提供了良好的数据支持,减少人工统计的工作量. 1.建议筛选器 ...

  2. java IO流 (九) Path、Paths、Files的使用

    1.NIO的使用说明:>Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的Java IO AP.>NI ...

  3. java 面向对象(十一):关键字:package/import

    1.1 使用说明: * 1.为了更好的实现项目中类的管理,提供包的概念 * 2.使用package声明类或接口所属的包,声明在源文件的首行 * 3.包,属于标识符,遵循标识符的命名规则.规范(xxxy ...

  4. 爬虫06 /scrapy框架

    爬虫06 /scrapy框架 目录 爬虫06 /scrapy框架 1. scrapy概述/安装 2. 基本使用 1. 创建工程 2. 数据分析 3. 持久化存储 3. 全栈数据的爬取 4. 五大核心组 ...

  5. 老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化

    引言 今天周末,我在家坐着掐指一算,马上又要到一年一度的金九银十招聘季了,国内今年上半年受到 YQ 冲击,金三银四泡汤了,这就直接导致很多今年毕业的同学会和明年毕业的同学一起参加今年下半年的秋招,这个 ...

  6. Unity-JobSystom

    什么是Job System? 一个job system通过创建jobs而不是线程来管理多线程的代码.Job是一个小的工作单元,不等同线程.管理运行在多个核心上的一组工人线程(worker thread ...

  7. 关于PowerShell调用Linq的一组实验

    Windows PowerShell 版权所有 (C) Microsoft Corporation.保留所有权利. 尝试新的跨平台 PowerShell https://aka.ms/pscore6 ...

  8. Active Directory - Server Remote administration management

    Windows Admin Center: https://www.microsoft.com/en-us/evalcenter/evaluate-windows-admin-center Remot ...

  9. 彻底禁用咱的Win10电脑更新

    一.关闭Windows Update服务 右键“此电脑”>“管理” 找到Windows Update服务双击打开,服务状态>停止,服务类型>禁用 “恢复”选项卡,三项全部选择“无操作 ...

  10. 最全JavaScript基础总结

    JavaScript介绍 什么是JavaScript? Javascript是一门面向对象的,跨平台的脚本语言. JavaScript有什么特点? 解释性脚本语言 运行在浏览器(浏览器内核带有js解释 ...