范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Lambda表达式与匿名内部类的内部实现区别

  在Java8提供Lambda表达式后,有些地方可以用比较简洁的Lambda表达式来代替原来相对冗余的匿名内部类了。那么Java在低层实现时,这2种方式有什么区别呢,下面通过例子来分析一下。 1、简单实例
  下面列出一个简单的类,类中提供了2 个方式,一个方式用匿名内部类的方式实现;另一个用Lambda表达式的方式实现,即: package io.github.lzj09.java8.lambda;  public class LambdaDemo1 {      public static void main(String[] args) {         LambdaDemo1 demo = new LambdaDemo1();          demo.anonymousClassMethod();         demo.lambdaFunctionMethod();     }      public void anonymousClassMethod() {         new Thread(new Runnable() {              @Override             public void run() {                 System.out.println("匿名内部类方式执行...");             }          }).start();     }      public void lambdaFunctionMethod() {         new Thread(() -> System.out.println("lambda函数方式执行...")).start();     } }
  程序很简单,输出的结果为: 匿名内部类方式执行... lambda函数方式执行... 2、分析生成的对应的class字节码文件
  查看classes文件夹中的字节码文件中,会发现有2个class文件,即LambdaDemo1.class和LambdaDemo1$1.class,如图:
  利用javap命令查看这2个class文件对应的汇编指令,首先看看LambdaDemo1$1.class文件,即输入如下命令: javap -c -p LambdaDemo1$1.class
  结果如下: Compiled from "LambdaDemo1.java" class io.github.lzj09.java8.lambda.LambdaDemo1$1 implements java.lang.Runnable {   final io.github.lzj09.java8.lambda.LambdaDemo1 this$0;    io.github.lzj09.java8.lambda.LambdaDemo1$1(io.github.lzj09.java8.lambda.LambdaDemo1);     Code:        0: aload_0        1: aload_1        2: putfield      #12                 // Field this$0:Lio/github/lzj09/java8/lambda/LambdaDemo1;        5: aload_0        6: invokespecial #14                 // Method java/lang/Object."":()V        9: return    public void run();     Code:        0: getstatic     #22                 // Field java/lang/System.out:Ljava/io/PrintStream;        3: ldc           #28                 // String 匿名内部类方式执行...        5: invokevirtual #30                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V        8: return }
  从上面的汇编指令大致可以看到LambdaDemo1$1类实现了Runnable接口,并实现run()方法,同时该方法输入一个字符串,即"匿名内部类方式执行..."。
  从上可以看出匿名内部类在 编译时 ,会生成一个类并实现Runnable接口同时实现run()方法。
  再利用javap命令查看LambdaDemo1.class文件,即: javap -c -p LambdaDemo1.class
  结果为: Compiled from "LambdaDemo1.java" public class io.github.lzj09.java8.lambda.LambdaDemo1 {   public io.github.lzj09.java8.lambda.LambdaDemo1();     Code:        0: aload_0        1: invokespecial #8                  // Method java/lang/Object."":()V        4: return    public static void main(java.lang.String[]);     Code:        0: new           #1                  // class io/github/lzj09/java8/lambda/LambdaDemo1        3: dup        4: invokespecial #16                 // Method "":()V        7: astore_1        8: aload_1        9: invokevirtual #17                 // Method anonymousClassMethod:()V       12: aload_1       13: invokevirtual #20                 // Method lambdaFunctionMethod:()V       16: return    public void anonymousClassMethod();     Code:        0: new           #26                 // class java/lang/Thread        3: dup        4: new           #28                 // class io/github/lzj09/java8/lambda/LambdaDemo1$1        7: dup        8: aload_0        9: invokespecial #30                 // Method io/github/lzj09/java8/lambda/LambdaDemo1$1."":(Lio/github/lzj09/java8/lambda/LambdaDemo1;)V       12: invokespecial #33                 // Method java/lang/Thread."":(Ljava/lang/Runnable;)V       15: invokevirtual #36                 // Method java/lang/Thread.start:()V       18: return    public void lambdaFunctionMethod();     Code:        0: new           #26                 // class java/lang/Thread        3: dup        4: invokedynamic #42,  0             // InvokeDynamic #0:run:()Ljava/lang/Runnable;        9: invokespecial #33                 // Method java/lang/Thread."":(Ljava/lang/Runnable;)V       12: invokevirtual #36                 // Method java/lang/Thread.start:()V       15: return    private static void lambda$0();     Code:        0: getstatic     #44                 // Field java/lang/System.out:Ljava/io/PrintStream;        3: ldc           #50                 // String lambda函数方式执行...        5: invokevirtual #52                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V        8: return }
  从上可以发现,多了一个方法lambda0(),而该方法内容刚好是Lambda表达式中的内容,即输出"lambda函数方式执行..."。到这其实会有一个疑问,这个lambda0(),而该方法内容刚好是Lambda表达式中的内容,即输出"lambda函数方式执行..."。到这其实会有一个疑问,这个lambda0()方法,在哪里被调用呢?这时需要利用java命令执行时,加入-Djdk.internal.lambda.dumpProxyClasses参数,这样才能真正看到lambda$0()方法调用过程,即: java -Djdk.internal.lambda.dumpProxyClasses io.github.lzj09.java8.lambda.LambdaDemo1
  执行该命令后,同样是会输出结果,即: 匿名内部类方式执行... lambda函数方式执行...
  但是查看classes文件,会发现多了一个class文件LambdaDemo1$Lambda$1.class,如图:
  同样用javap命令查看LambdaDemo1$Lambda$1.class的汇编指令,即: javap -c -p LambdaDemo1$Lambda$1.class
  得到如下结果: final class io.github.lzj09.java8.lambda.LambdaDemo1$Lambda$1 implements java.lang.Runnable {   private io.github.lzj09.java8.lambda.LambdaDemo1$Lambda$1();     Code:        0: aload_0        1: invokespecial #10                 // Method java/lang/Object."":()V        4: return    public void run();     Code:        0: invokestatic  #17                 // Method io/github/lzj09/java8/lambda/LambdaDemo1.lambda$0:()V        3: return }
  可以发现类LambdaDemo1$Lambda$1实现了Runnable接口,并实现run()方法,同时该方法中就是调用LambdaDemo1类中编译时生成的lambda$0()方法的。 3、总结
  Lambda表达式与匿名内部类的低层实现过程还是有些区别的: 匿名内部类是在 编译时 ,新增一个class,同时该class中实现相应的接口和方法。 Lambda表达式 编译时 会先新增一个方法,该方法内容即为Lambda表达式中的内容. 运行时 会新增一个class,同时该class中实现相应的接口和方法,但方法中是调用第1步中生成的方法。

如何选购智能手表?(实测篇)在如何选购智能手表之一初评篇中,芯媒针对目前智能手表的十大功能特性(心率GPS血氧血糖血压独立音乐播放eSIMNFCApp续航防水AI语音颜值等)进行了初步评选。对于跑步者来说,GSpringCloud升级之路2020。0。x版30。FeignClient实现重试本系列代码地址httpsgithub。comJoJoTecspringcloudparent需要重试的场景微服务系统中,会遇到在线发布,一般的发布更新策略是启动一个新的,启动成功之币圈那些事埃隆马斯克狗狗币1。14。5升级是重要的金色财经报道,狗狗币已发布DogecoinCore1。14。5升级。由于包括重要的安全修复,建议用户立即更新。继在1。14。4中降低了中继费贵有贵的道理!目前这4部旗舰手机最值得考虑,几乎没有短板很多人买手机总觉得选贵的就是浪费钱,其实恰恰相反,一部好的旗舰手机不仅可以给你带来好的体验,还可以有着更长的使用寿命,综合下来还更省钱,另外还更省心,试问何乐而不为?所以,不要嫌旗贵有贵的道理!目前这4部旗舰手机最值得考虑,几乎没有短板很多朋友会觉得手机没有必要买贵的,其实不然。好的旗舰手机不仅能让你有更愉悦的使用体验,往往还有着更长的使用寿命,平均到每天的使用时间,其实更省钱!所以,如果大家预算充足,大胆安排上iPhone14ProMax概念机2TB容量4800毫安电池,定价1万5撑得起吗今年发布的iPhone13ProMax不仅新增远峰蓝色,而且首次将存储容量提升到1TB,电池容量超过4000毫安。别看外观变化不大,但新加入的功能都非常实用。作为一款超大杯机型,i晒晒我的双十一战利品,入手了三款数码好物,大家觉得值不值?话说今年的双十一电商大促早早就开始预售了,进入11月既是付尾款环节,也是一年中最火爆的网购期。作为一名对数码产品爱好者,我也在首销优惠期间为自己增添不少心仪的新装备,例如经过精挑细又是一年大促际,挑几款中意的影音设备盘点下,头戴史低正当时虽说现在玩EDC比较多,现音频仍旧是永远的心头好。就像曾经大学校园时手拿MP3听着各种曲风的音乐,那份美好仍在。时光荏苒,虽然如今闲的时候不多,但每天听歌的习惯被保留了下来。近年来送家人送自己!2021年,2000元档位最具性价比的手机推荐前言不知不觉,一年又快到头了,不知道各位小伙伴的钱包有没有如愿鼓起来呢?不管是好是坏,一年到头还是要犒劳一下关心自己的家人和辛苦工作的自己。两千元档位的中端机一直是手机届的霸主地位比特币以太坊双双刷新高,以太坊市值超腾讯,比特币直追亚马逊11月9日早间,据Huobiglobal数据显示,加密货币BTC(下称比特币)涨逾1报67777美元枚的新高,总市值1。27万亿美元。ETH(下称以太坊)盘中涨逾1报4823美元枚别再笑话买三星是人傻钱多了,这3款手机不仅便宜,配置还很全能不知道现在还有多少人在嘲笑买三星是人傻钱多,如果你真的了解现在的三星手机,我想应该很明白,在折叠屏手机市场中,三星技术是最成熟的,而且这两年三星在不断下调折叠屏手机的售价,同时主流
移动云校园专场推荐那些适合学生党使用的云服务器提到服务器,大部分人的第一感觉就是价格贵上手难,文科生可能甚至不知道是啥东西。今天,移动云小编就给大家扫盲,并且整理了几个云平台的大学生优惠,十块钱买不了吃亏,却能买到一台服务器!独家首发北汽全新BEIJINGX7运动内饰曝光日前,从北京汽车的路试车辆中拍摄到了一组BEIJINGX7的运动内饰,双色的内饰设计更突显出整个新车的精致感,新车在配置方面将搭载蓝牙语音识别和电子换挡等实用性配置。据了解,BEI长安UNIT云上市售价11。39万元起6月21日,长安汽车乘用车高端产品序列UNI的首款新车UNIT正式上市,共推出豪华型尊贵型旗舰型3款车型,官方指导价11。39万元13。39万元。新车采用全新的设计语言,全新的智能宏光MINI电动车更多细节曝光,预售价2。98万元起近期,五菱品牌首款四座新能源车宏光MINI电动车发布2。98万元起的亲民预售价,引发消费者关注。作为一台日常代步使用的小车,宏光MINI电动车安全品质究竟如何,是否满足需求?作为人华为智慧屏系列国庆大促模式开启,优惠最高可达1500元金秋十月是丰收的季节,同时也是也是购物抢购狂欢季,金九银十之于众多领域而言都是一年中的销售旺季,具体到大屏产品,家装市场进入黄金时期中秋国庆双节来临等利好因素下,用户添置家电的需求Z世代潮人必备,华为nova9系列手机10亿色臻彩打造无敌新视界近日,B站数码频道不知不觉地被一股华为风所占领,出现了不少华为nova9系列手机的自来水。对于已经将nova9系列拿到手的人来说,都是各种宠溺的解读,而对于那些没有拿到nova9系华为nova9系列9号色潮美设计,走在路上回头率爆表一直以来,华为nova系列深受年轻消费者的青睐,尤其现在这个时代,很多人都想入手一款影像功能比较强大的手机,华为nova9系列手机今天终于迎来首销,作为首款年轻人的鸿蒙影像旗舰,相魅族18Spro和苹果11价格一样,到底选择谁买合适?对于这两款手机,该如何选择的问题,首先你就要问一下自己到底有没有5G网络的需求。如果你想要购买一台5G手机,那么直接入手魅族18Spro这款手机就可以了。如果你习惯使用iOS系统且维业股份深化产业链战略布局,多重因素驱动有望持续释放增长潜力10月27日晚间,维业股份(300621。SZ)发布2021年三季度报告,报告显示,2021年前三季度公司实现营业收入约65。56亿元,同比增加207。13归属于上市公司股东的净利iQOOz5和小米11青春版价格差不多,买哪款好?2021年九月份,iQOO给广大消费者带来了一款名为iQOOz5的手机。那么iQOOz5这款手机和它的竞品小米11青春版相比较哪一款更值得购买呢?就小芳个人而言,iQOOz5这款手iQOOz5和荣耀play5相比较,买哪款好?这两款手机之间,大家完全不用考虑直接入手iQOOz5这款手机就可以了,因为iQOOz5这款手机的性价比完全是能够吊打荣耀play5这款手机的。不过为了让我小芳这个论述更加具有说服力