• 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相关推荐

  1. JAVA匿名内部类(Anonymous Classes)

    1.前言 匿名内部类在我们JAVA程序员的日常工作中经常要用到,但是很多时候也只是照本宣科地用,虽然也在用,但往往忽略了以下几点:为什么能这么用?匿名内部类的语法是怎样的?有哪些限制?因此,最近,我在 ...

  2. 匿名类(Anonymous Classes)

    匿名类 匿名类可以让代码更加简洁,因为它允许声明的同时实例化一个类.类似于局部类,只不过他们没有名字,当只需要一次局部类时,用匿名类更简洁. 匿名类的声明 局部类的声明是类的声明,但匿名类的声明是一个 ...

  3. C#体贴之处点滴 - extention method, lambda expression, anonymous method

    说的是C#如何体贴程序员,而非.NET Framework. 这是C#对Delegate相关领域下的精微功夫:     List<Product> products = Product.G ...

  4. 四万字 Lambda 表达式完整教程(强烈建议收藏)

    点击关注公众号,利用碎片时间学习 Java Lambda表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法.实际上Lambda表达式并不仅仅是匿名内部类的语法糖,JV ...

  5. java-面向对象基础语法

    目录 chapter 2 1.多态 2.final关键字 3.抽象类 4.接口 5. 内部类 5.1 成员内部类*(不是重点) 5.2 静态内部类 5.3 匿名内部类 5.4 枚举类 6. 泛型 6. ...

  6. 深入学习Java8 Lambda (default method, lambda, function reference, java.util.function 包)

    Java 8 Lambda .MethodReference.function包 多年前,学校讲述C#时,就已经知道有Lambda,也惊喜于它的方便,将函数式编程方式和面向对象式编程基于一身.此外在使 ...

  7. java lambda函数_Java SE 8新功能介绍:使用Lambda Expression进行函数式编程

    java lambda函数 " Java SE 8新功能浏览 "系列的这篇文章将深入了解Lambda表达式 . 我将向您展示Lambda表达式的几种不同用法. 它们都具有功能接口的 ...

  8. Java SE 8新特性导览:使用Lambda Expression进行函数式编程

    " Java SE 8新功能浏览 "系列的这篇文章将深入了解Lambda表达式 . 我将向您展示Lambda表达式的几种不同用法. 它们都具有功能接口的共同实现. 我将解释编译器如 ...

  9. Java8————Lambda表达式(二)

    译者注:文中内容均来自于官方教程<Lambda Expressions>,但是由于英汉语言的差异,部分语句官方描述过于冗余,因此译者根据通常状况的理解做了微调,但不会影响表达的含义.比如: ...

最新文章

  1. linux symbolic link attack tutorial
  2. apt包管理 Android,apt软件包管理学习(示例代码)
  3. Spark _25 _读取Hive中的数据加载成DataFrame/DataSet(四)
  4. DDD理论学习系列(5)-- 统一建模语言
  5. SpringBoot:与MyBatis合作
  6. 分组后分页_SQL(约束、视图、分页、序列、索引、同义词、创建用户,为用户授权、执行计划的使用 数据的导入导出)...
  7. nodejs安装服务器系统,window下,nodejs安装http-server,并开启HTTP服务器
  8. git 实践(二) push的使用
  9. 接口参数,get和post
  10. Apache Tomcat 再爆严重安全漏洞
  11. 【Caffe代码分析】DataLayer
  12. PHP 进程间通信——消息队列(msg_queue)
  13. 二代神经计算棒NCS2+YOLOv3+ROS加速目标检测
  14. 2022国开中国现代文学专题阶段作业2-4答案
  15. Riverbed’s Modeler Academic
  16. Mobileye超详细研报:高逼格ADAS的内在修养
  17. HazelEngine 学习记录 - 2D Renderer Transforms and 2D Renderer Textures
  18. JavaEE实现微博项目(含注册、登录、发表微博、评论微博、关注博主、阅读排行榜、评论排行榜等功能)
  19. mysql查询数学成绩信息_【MySQL】:利用DQL查询表中的数据
  20. mysql workbench怎么_怎么打开mysql workbench

热门文章

  1. c语言万年历需要注意什么意思,C语言万年历
  2. linux 同步 mac,WorkFlowy Beta for Mac(跨平台同步笔记工具)
  3. mysql 数据库编译安装_mysql 数据库 编译安装(千峰)
  4. 红盟php 解密,php教程_神盾加密解密教程(一)PHP变量可用字符
  5. linux java aptget_apt-get没有安装任何linux服务器
  6. python中3个单引号_Python中单引号,双引号,3个单引号及3个双引号的区别
  7. vc c语言 颜色输出字符,关于printf如何输出颜色
  8. ajax mysql项目 react_React16时代,该用什么姿势写 React ?
  9. 指向成员函数的指针有什么用_指针函数,函数指针,有点懵圈了?你能分清楚吗...
  10. Python如何在控制台显示进度条