java lambda 调用函数_Java lambda函数将如何编译?

VM决定如何实现lambda,而不是编译器。

请参阅Lambda表达式的翻译中的for部分。

我们没有描述生成用于实现lambda表达式的对象的字节码(例如,调用内部类的构造函数),而是描述了构造lambda的方法,并将实际构造委托给语言运行时。 该配方被编码在invokedynamic指令的静态和动态参数列表中。

就简单的编译或性能而言,您的示例中的for构造是最有效的方法(但根据测试,性能差异很小)。

添加在:

我创建并分解了两个示例:

for (String string: Arrays.asList("hello")) {

System.out.println(string);

}

反汇编的字节码,常量和其他信息:

Classfile LambdaCode.class

Last modified 30.05.2013; size 771 bytes

MD5 checksum 79bf2821b5a14485934e5cebb60c99d6

Compiled from "LambdaCode.java"

public class test.lambda.LambdaCode

SourceFile: "LambdaCode.java"

minor version: 0

major version: 52

flags: ACC_PUBLIC, ACC_SUPER

Constant pool:

#1 = Methodref #11.#22 // java/lang/Object."":()V

#2 = Class #23 // java/lang/String

#3 = String #24 // hello

#4 = Methodref #25.#26 // java/util/Arrays.asList:([Ljava/lang/Object;)Ljava/util/List;

#5 = InterfaceMethodref #27.#28 // java/util/List.iterator:()Ljava/util/Iterator;

#6 = InterfaceMethodref #29.#30 // java/util/Iterator.hasNext:()Z

#7 = InterfaceMethodref #29.#31 // java/util/Iterator.next:()Ljava/lang/Object;

#8 = Fieldref #32.#33 // java/lang/System.out:Ljava/io/PrintStream;

#9 = Methodref #34.#35 // java/io/PrintStream.println:(Ljava/lang/String;)V

#10 = Class #36 // test/lambda/LambdaCode

#11 = Class #37 // java/lang/Object

#12 = Utf8

#13 = Utf8 ()V

#14 = Utf8 Code

#15 = Utf8 LineNumberTable

#16 = Utf8 main

#17 = Utf8 ([Ljava/lang/String;)V

#18 = Utf8 StackMapTable

#19 = Class #38 // java/util/Iterator

#20 = Utf8 SourceFile

#21 = Utf8 LambdaCode.java

#22 = NameAndType #12:#13 // "":()V

#23 = Utf8 java/lang/String

#24 = Utf8 hello

#25 = Class #39 // java/util/Arrays

#26 = NameAndType #40:#41 // asList:([Ljava/lang/Object;)Ljava/util/List;

#27 = Class #42 // java/util/List

#28 = NameAndType #43:#44 // iterator:()Ljava/util/Iterator;

#29 = Class #38 // java/util/Iterator

#30 = NameAndType #45:#46 // hasNext:()Z

#31 = NameAndType #47:#48 // next:()Ljava/lang/Object;

#32 = Class #49 // java/lang/System

#33 = NameAndType #50:#51 // out:Ljava/io/PrintStream;

#34 = Class #52 // java/io/PrintStream

#35 = NameAndType #53:#54 // println:(Ljava/lang/String;)V

#36 = Utf8 test/lambda/LambdaCode

#37 = Utf8 java/lang/Object

#38 = Utf8 java/util/Iterator

#39 = Utf8 java/util/Arrays

#40 = Utf8 asList

#41 = Utf8 ([Ljava/lang/Object;)Ljava/util/List;

#42 = Utf8 java/util/List

#43 = Utf8 iterator

#44 = Utf8 ()Ljava/util/Iterator;

#45 = Utf8 hasNext

#46 = Utf8 ()Z

#47 = Utf8 next

#48 = Utf8 ()Ljava/lang/Object;

#49 = Utf8 java/lang/System

#50 = Utf8 out

#51 = Utf8 Ljava/io/PrintStream;

#52 = Utf8 java/io/PrintStream

#53 = Utf8 println

#54 = Utf8 (Ljava/lang/String;)V

{

public test.lambda.LambdaCode();

descriptor: ()V

flags: ACC_PUBLIC

Code:

stack=1, locals=1, args_size=1

0: aload_0

1: invokespecial #1 // Method java/lang/Object."":()V

4: return

LineNumberTable:

line 15: 0

public static void main(java.lang.String[]);

descriptor: ([Ljava/lang/String;)V

flags: ACC_PUBLIC, ACC_STATIC

Code:

stack=4, locals=3, args_size=1

0: iconst_1

1: anewarray #2 // class java/lang/String

4: dup

5: iconst_0

6: ldc #3 // String hello

8: aastore

9: invokestatic #4 // Method java/util/Arrays.asList:([Ljava/lang/Object;)Ljava/util/List;

12: invokeinterface #5, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;

17: astore_1

18: aload_1

19: invokeinterface #6, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z

24: ifeq 47

27: aload_1

28: invokeinterface #7, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;

33: checkcast #2 // class java/lang/String

36: astore_2

37: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;

40: aload_2

41: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

44: goto 18

47: return

LineNumberTable:

line 35: 0

line 36: 37

line 37: 44

line 38: 47

StackMapTable: number_of_entries = 2

frame_type = 252 /* append */

offset_delta = 18

locals = [ class java/util/Iterator ]

frame_type = 250 /* chop */

offset_delta = 28

}

Arrays.asList("hello").forEach(p -> {System.out.println(p);});

反汇编的字节码,常量和其他信息:

Classfile LambdaCode.class

Last modified 30.05.2013; size 1262 bytes

MD5 checksum 4804e0a37b73141d5791cc39d51d649c

Compiled from "LambdaCode.java"

public class test.lambda.LambdaCode

SourceFile: "LambdaCode.java"

InnerClasses:

public static final #64= #63 of #70; //Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles

BootstrapMethods:

0: #27 invokestatic java/lang/invoke/LambdaMetafactory.metaFactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;

Method arguments:

#28 invokeinterface java/util/function/Consumer.accept:(Ljava/lang/Object;)V

#29 invokestatic test/lambda/LambdaCode.lambda$0:(Ljava/lang/String;)V

#30 (Ljava/lang/String;)V

minor version: 0

major version: 52

flags: ACC_PUBLIC, ACC_SUPER

Constant pool:

#1 = Methodref #10.#21 // java/lang/Object."":()V

#2 = Class #22 // java/lang/String

#3 = String #23 // hello

#4 = Methodref #24.#25 // java/util/Arrays.asList:([Ljava/lang/Object;)Ljava/util/List;

#5 = InvokeDynamic #0:#31 // #0:lambda$:()Ljava/util/function/Consumer;

#6 = InterfaceMethodref #32.#33 // java/util/List.forEach:(Ljava/util/function/Consumer;)V

#7 = Fieldref #34.#35 // java/lang/System.out:Ljava/io/PrintStream;

#8 = Methodref #36.#37 // java/io/PrintStream.println:(Ljava/lang/String;)V

#9 = Class #38 // test/lambda/LambdaCode

#10 = Class #39 // java/lang/Object

#11 = Utf8

#12 = Utf8 ()V

#13 = Utf8 Code

#14 = Utf8 LineNumberTable

#15 = Utf8 main

#16 = Utf8 ([Ljava/lang/String;)V

#17 = Utf8 lambda$0

#18 = Utf8 (Ljava/lang/String;)V

#19 = Utf8 SourceFile

#20 = Utf8 LambdaCode.java

#21 = NameAndType #11:#12 // "":()V

#22 = Utf8 java/lang/String

#23 = Utf8 hello

#24 = Class #40 // java/util/Arrays

#25 = NameAndType #41:#42 // asList:([Ljava/lang/Object;)Ljava/util/List;

#26 = Utf8 BootstrapMethods

#27 = MethodHandle #6:#43 // invokestatic java/lang/invoke/LambdaMetafactory.metaFactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;

#28 = MethodHandle #9:#44 // invokeinterface java/util/function/Consumer.accept:(Ljava/lang/Object;)V

#29 = MethodHandle #6:#45 // invokestatic test/lambda/LambdaCode.lambda$0:(Ljava/lang/String;)V

#30 = MethodType #18 // (Ljava/lang/String;)V

#31 = NameAndType #46:#47 // lambda$:()Ljava/util/function/Consumer;

#32 = Class #48 // java/util/List

#33 = NameAndType #49:#50 // forEach:(Ljava/util/function/Consumer;)V

#34 = Class #51 // java/lang/System

#35 = NameAndType #52:#53 // out:Ljava/io/PrintStream;

#36 = Class #54 // java/io/PrintStream

#37 = NameAndType #55:#18 // println:(Ljava/lang/String;)V

#38 = Utf8 test/lambda/LambdaCode

#39 = Utf8 java/lang/Object

#40 = Utf8 java/util/Arrays

#41 = Utf8 asList

#42 = Utf8 ([Ljava/lang/Object;)Ljava/util/List;

#43 = Methodref #56.#57 // java/lang/invoke/LambdaMetafactory.metaFactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;

#44 = InterfaceMethodref #58.#59 // java/util/function/Consumer.accept:(Ljava/lang/Object;)V

#45 = Methodref #9.#60 // test/lambda/LambdaCode.lambda$0:(Ljava/lang/String;)V

#46 = Utf8 lambda$

#47 = Utf8 ()Ljava/util/function/Consumer;

#48 = Utf8 java/util/List

#49 = Utf8 forEach

#50 = Utf8 (Ljava/util/function/Consumer;)V

#51 = Utf8 java/lang/System

#52 = Utf8 out

#53 = Utf8 Ljava/io/PrintStream;

#54 = Utf8 java/io/PrintStream

#55 = Utf8 println

#56 = Class #61 // java/lang/invoke/LambdaMetafactory

#57 = NameAndType #62:#66 // metaFactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;

#58 = Class #67 // java/util/function/Consumer

#59 = NameAndType #68:#69 // accept:(Ljava/lang/Object;)V

#60 = NameAndType #17:#18 // lambda$0:(Ljava/lang/String;)V

#61 = Utf8 java/lang/invoke/LambdaMetafactory

#62 = Utf8 metaFactory

#63 = Class #71 // java/lang/invoke/MethodHandles$Lookup

#64 = Utf8 Lookup

#65 = Utf8 InnerClasses

#66 = Utf8 (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;

#67 = Utf8 java/util/function/Consumer

#68 = Utf8 accept

#69 = Utf8 (Ljava/lang/Object;)V

#70 = Class #72 // java/lang/invoke/MethodHandles

#71 = Utf8 java/lang/invoke/MethodHandles$Lookup

#72 = Utf8 java/lang/invoke/MethodHandles

{

public test.lambda.LambdaCode();

descriptor: ()V

flags: ACC_PUBLIC

Code:

stack=1, locals=1, args_size=1

0: aload_0

1: invokespecial #1 // Method java/lang/Object."":()V

4: return

LineNumberTable:

line 15: 0

public static void main(java.lang.String[]);

descriptor: ([Ljava/lang/String;)V

flags: ACC_PUBLIC, ACC_STATIC

Code:

stack=4, locals=1, args_size=1

0: iconst_1

1: anewarray #2 // class java/lang/String

4: dup

5: iconst_0

6: ldc #3 // String hello

8: aastore

9: invokestatic #4 // Method java/util/Arrays.asList:([Ljava/lang/Object;)Ljava/util/List;

12: invokedynamic #5, 0 // InvokeDynamic #0:lambda$:()Ljava/util/function/Consumer;

17: invokeinterface #6, 2 // InterfaceMethod java/util/List.forEach:(Ljava/util/function/Consumer;)V

22: return

LineNumberTable:

line 28: 0

line 38: 22

}

对于Lambda示例,编译器生成的类文件更复杂且更大(771b对1262b)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤教育】国家开放大学2018年春季 0632-22T老年保健按摩 参考试题

科目编号:0632 座位号 2017-2018学年度第二学期期末考试 老年保健按摩试题 2018年7月 一、名词解释(本大题共5小题,每小题4分,共计20分) 1.老年病: 2.耳穴疗法: 3.拔罐疗法: 4.刮…

q7goodies事例_Java 8 Friday Goodies:精益并发

q7goodies事例在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 ,现在我们觉得是时候开始一个…

【渝粤教育】国家开放大学2018年春季 0700-22T中级会计实务(一) 参考试题

科目编号:0700 座位号 2017-2018学年度第二学期期末考试 中级会计实务(一) 试题 2018年 7 月 一、单选题(本大题共10小题,每小题3分,共计30分) (★请考生务必将答案填入到下面对应序…

工业交换机的外壳设计重要吗?

工业交换机一般使用在环境比较恶劣的地方,例如工厂等,为了让工业交换机更好的使用,工业交换机的外壳设计起到至关重要的作用,工业交换机的外壳可以更好的保护工业交换机的使用,那么如何才能选到实用的工业交换机外壳呢…

java 邮件 超链接_将Excel范围中的超链接传输到Outlook电子邮件

我正在尝试从excel范围(rng 1到6)创建一个电子邮件,其中包含A列和D列中每个单元格的超链接 . 以下是为这些范围创建超链接的代码示例 . 一切正常 .ActiveSheet.Hyperlinks.Add Anchor:ActiveWorkbook.Sheets("Overdue").Range("A" & D2), _…

【渝粤教育】国家开放大学2018年春季 3818-22T燃气工程施工 参考试题

科目编号:3818 座位号 2017-2018学年度第二学期期末考试 燃气工程施工 试题 2018年 7 月 一、填空题(本大题共10空,每空3分,共计30分) 1.常用沟槽断面有___________________、、、联合槽四种形式。 2&…

【渝粤教育】国家开放大学2018年春季 7140-22T危急重症护理学(本) 参考试题

编号:7140 座位号 2017~2018学年度第二学期期末考试 危急重症护理学试题 2018年07月 一、名词解释(每题5分,共20分) 甲状腺危象 中毒 心肺脑复苏 惊厥 二、填空 (每空3分,共30分&#xff…

工业交换机和工业4G路由器的区分

工业交换机也称作工业以太网交换机,即应用于工业控制领域的以太网交换机设备,由于采用的网络标准,其开放性好、应用广泛以及价格低廉、使用的是透明而统一的TCP/IP协议,以太网已经成为工业控制领域的主要通信标准。工业交换机具有…

java 包装类方法总结_【源码】java包装类总结

1.包装类除了Void和Character,其他六个全部都继承自Number。Number是一个抽象类。如下:public abstract class Number implements java.io.Serializable {public abstract int intValue();public abstract long longValue();public abstract float float…

扩展枚举功能的两种方法

前言 在上一篇文章中,我解释了如何以及为什么在Java代码中使用enums而不是switch/case控制结构。 在这里,我将展示如何扩展现有enums功能。 介绍 Java enum是一种编译器魔术。 在字节码中,任何enum都表示为扩展抽象类java.lang.Enum并具有几…

【渝粤教育】国家开放大学2018年春季 7403-21T素质与思想政治教育 参考试题

编码:7403 座位号: 2017-2018学年度第二学期期末考试 素质与思想政治教育试题(开卷) 2018年7月 一、单项选择题(每题3分,共30分) 考生注意:请将答案填写在下面的方框内,…

工业交换机和工业级光纤收发器的区别

工业交换机和工业级光纤收发器都是网络数据传输设备中的重要组成部分。工业交换机是进行网络内数据交换的一种以太网连接设备,而工业级光纤收发器是延长传输距离的一种光电转换设备。那么他们之间具体有哪些不同之处呢?接下来就由飞畅科技的小编来为大家…

【渝粤教育】国家开放大学2018年春季 8635-21T老年人中医体质辨识与养 参考试题

科目编号:8635 座位号 2017-2018学年度第二学期期末考试 老年人中医体质辨识与养生保健试题 2018年6月 一、名词解释(本大题共5小题,每小题4分,共计20分) 1.拔罐 2.炙法 3.气虚体质 4.阳虚体质 5.痰湿体质 二、填…

java.lang.stackoverflowerror_java.lang.StackOverflowError——如何解决StackOverflowError错误

StackOverflowError在程序栈空间耗尽时抛出,通常是深度递归导致。StackOverflowError继承了VirtualMachineError类,后者表示JVM已被破坏或资源耗尽。更进一步,VirtualMachineError继承自Error类,应用程序不应该捕获这种严重的错误…

【渝粤教育】国家开放大学2018年春季 8664-21T文书档案管理 参考试题

试卷编号:8664 座位号 2017——2018学年度第二学期期末考试 文 书 档 案 管 理 试 题 2018年7月 1.从文书的形成和使用上划分,文书可分为 和 两类。 2.文头一般由公文名称(又称版头)、 、 、 、 等部组成…

couchbase_Spring Data Couchbase 1.0 GA发布

couchbaseSpring Data Couchbase 1.0 GA版本已发布! 该项目是Spring Data项目的一部分,该项目旨在为新数据存储提供熟悉且一致的基于Spring的编程模型,同时保留特定于存储的功能。 Spring Data Couchbase项目提供了与Couchbase Server数据库…

工业交换机厂家,工业交换机品牌前十大排名

工业交换机,也叫工业以太网交换机。随着物联网的快速发展,工业交换机市场竞争也越来越激烈。国内的工业交换机厂家,像北京东土、深圳三旺、杭州飞畅科技等都有自己的研发团队,产品质量和进口的几乎没有差别,但是价格比…

【渝粤教育】国家开放大学2018年秋季 0043-22T计算机文化 参考试题

编号:0053 座位号: 2018~2019学年度第一学期期末考试 立体构成 试题 2019年1月 一、实作题(100分) 运用所学知识,完成一件“渐变层面构造”的立体构成作品。 要求:1.所用材料为纸质材料。 2.作…

设计php框架_自制PHP框架之设计模式

为什么要使用设计模式?设计模式,我的理解是为了达到“可复用”这个目标,而设计的一套相互协作的类。感兴趣的读者可以阅读《Design Patterns: Elements of Reusable Object-Oriented Software》,四位作者(Gang of Four)在书中列举…

Java将列表转换为数组,反之亦然

介绍: 在本文中, 我们将快速学习如何将Java List (例如ArrayList )转换为数组,反之亦然。 如果您希望总体上了解有关ArrayList的更多信息,请随时阅读我们有关Java ArrayLists的文章。 同时,让我…