Lambda and Anonymous Classes
Lambda 简写的依据
能够使用 Lambda 的依据是必须有相应的函数接口(函数接口,是指内部只有一个抽象方法的接口),也就是说你并不能在代码的任何地方任性的写Lambda表达式。Lambda表达式另一个依据是类型推断机制(在上下文信息足够的情况下,编译器可以推断出参数表的类型,而不需要显式指名)
Anonymous Classes
匿名内部类仍然是一个类,只是不需要程序员显示指定类名,编译器会自动为该类取名。因此如果有如下形式的代码,编译之后将会产生两个class文件:
public class MainAnonymousClass {public static void main(String[] args) {new Thread(new Runnable(){@Overridepublic void run(){System.out.println("Anonymous Class Thread run()");}}).start();;} } 复制代码
编译之后文件分布如下,两个class文件分别是主类和匿名内部类产生的:
进一步分析主类MainAnonymousClass.class的字节码,可发现其创建了匿名内部类的对象:
// javap -c MainAnonymousClass.class public class MainAnonymousClass {...public static void main(java.lang.String[]);Code:0: new #2 // class java/lang/Thread3: dup4: new #3 // class MainAnonymousClass$1 /*创建内部类对象*/7: dup8: invokespecial #4 // Method MainAnonymousClass$1."<init>":()V11: invokespecial #5 // Method java/lang/Thread."<init>":(Ljava/lang/Runnable;)V14: invokevirtual #6 // Method java/lang/Thread.start:()V17: return } 复制代码
Lambda 表达式的实现
Lambda 表达式通过 invokedynamic 指令实现,书写 Lambda 表达式不会产生新的类。
public class MainLambda {public static void main(String[] args) {new Thread(() -> System.out.println("Lambda Thread run()")).start();;} } 复制代码
编译之后:
通过javap反编译命名,我们更能看出Lambda表达式内部表示的不同:
// javap -c -p MainLambda.class
public class MainLambda {...public static void main(java.lang.String[]);Code:0: new #2 // class java/lang/Thread3: dup4: invokedynamic #3, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable; /*使用invokedynamic指令调用*/9: invokespecial #4 // Method java/lang/Thread."<init>":(Ljava/lang/Runnable;)V12: invokevirtual #5 // Method java/lang/Thread.start:()V15: returnprivate static void lambda$main$0(); /*Lambda表达式被封装成主类的私有方法*/Code:0: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;3: ldc #7 // String Lambda Thread run()5: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V8: return
}
复制代码
反编译之后我们发现Lambda表达式被封装成了主类的一个私有方法,并通过invokedynamic指令进行调用。
Lambda and Anonymous Classes相关推荐
- JAVA匿名内部类(Anonymous Classes)
1.前言 匿名内部类在我们JAVA程序员的日常工作中经常要用到,但是很多时候也只是照本宣科地用,虽然也在用,但往往忽略了以下几点:为什么能这么用?匿名内部类的语法是怎样的?有哪些限制?因此,最近,我在 ...
- 匿名类(Anonymous Classes)
匿名类 匿名类可以让代码更加简洁,因为它允许声明的同时实例化一个类.类似于局部类,只不过他们没有名字,当只需要一次局部类时,用匿名类更简洁. 匿名类的声明 局部类的声明是类的声明,但匿名类的声明是一个 ...
- C#体贴之处点滴 - extention method, lambda expression, anonymous method
说的是C#如何体贴程序员,而非.NET Framework. 这是C#对Delegate相关领域下的精微功夫: List<Product> products = Product.G ...
- 四万字 Lambda 表达式完整教程(强烈建议收藏)
点击关注公众号,利用碎片时间学习 Java Lambda表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法.实际上Lambda表达式并不仅仅是匿名内部类的语法糖,JV ...
- java-面向对象基础语法
目录 chapter 2 1.多态 2.final关键字 3.抽象类 4.接口 5. 内部类 5.1 成员内部类*(不是重点) 5.2 静态内部类 5.3 匿名内部类 5.4 枚举类 6. 泛型 6. ...
- 深入学习Java8 Lambda (default method, lambda, function reference, java.util.function 包)
Java 8 Lambda .MethodReference.function包 多年前,学校讲述C#时,就已经知道有Lambda,也惊喜于它的方便,将函数式编程方式和面向对象式编程基于一身.此外在使 ...
- java lambda函数_Java SE 8新功能介绍:使用Lambda Expression进行函数式编程
java lambda函数 " Java SE 8新功能浏览 "系列的这篇文章将深入了解Lambda表达式 . 我将向您展示Lambda表达式的几种不同用法. 它们都具有功能接口的 ...
- Java SE 8新特性导览:使用Lambda Expression进行函数式编程
" Java SE 8新功能浏览 "系列的这篇文章将深入了解Lambda表达式 . 我将向您展示Lambda表达式的几种不同用法. 它们都具有功能接口的共同实现. 我将解释编译器如 ...
- Java8————Lambda表达式(二)
译者注:文中内容均来自于官方教程<Lambda Expressions>,但是由于英汉语言的差异,部分语句官方描述过于冗余,因此译者根据通常状况的理解做了微调,但不会影响表达的含义.比如: ...
最新文章
- linux symbolic link attack tutorial
- apt包管理 Android,apt软件包管理学习(示例代码)
- Spark _25 _读取Hive中的数据加载成DataFrame/DataSet(四)
- DDD理论学习系列(5)-- 统一建模语言
- SpringBoot:与MyBatis合作
- 分组后分页_SQL(约束、视图、分页、序列、索引、同义词、创建用户,为用户授权、执行计划的使用 数据的导入导出)...
- nodejs安装服务器系统,window下,nodejs安装http-server,并开启HTTP服务器
- git 实践(二) push的使用
- 接口参数,get和post
- Apache Tomcat 再爆严重安全漏洞
- 【Caffe代码分析】DataLayer
- PHP 进程间通信——消息队列(msg_queue)
- 二代神经计算棒NCS2+YOLOv3+ROS加速目标检测
- 2022国开中国现代文学专题阶段作业2-4答案
- Riverbed’s Modeler Academic
- Mobileye超详细研报:高逼格ADAS的内在修养
- HazelEngine 学习记录 - 2D Renderer Transforms and 2D Renderer Textures
- JavaEE实现微博项目(含注册、登录、发表微博、评论微博、关注博主、阅读排行榜、评论排行榜等功能)
- mysql查询数学成绩信息_【MySQL】:利用DQL查询表中的数据
- mysql workbench怎么_怎么打开mysql workbench
热门文章
- c语言万年历需要注意什么意思,C语言万年历
- linux 同步 mac,WorkFlowy Beta for Mac(跨平台同步笔记工具)
- mysql 数据库编译安装_mysql 数据库 编译安装(千峰)
- 红盟php 解密,php教程_神盾加密解密教程(一)PHP变量可用字符
- linux java aptget_apt-get没有安装任何linux服务器
- python中3个单引号_Python中单引号,双引号,3个单引号及3个双引号的区别
- vc c语言 颜色输出字符,关于printf如何输出颜色
- ajax mysql项目 react_React16时代,该用什么姿势写 React ?
- 指向成员函数的指针有什么用_指针函数,函数指针,有点懵圈了?你能分清楚吗...
- Python如何在控制台显示进度条