例如,在匿名内部类的情况下,将传递(匿名)对象引用并执行该对象的方法。
Lambda 是在需要时执行的代码块。
当遇到 lambda 时,JVM 中会发生什么? JVM 在哪里存储与 lambda 相关的代码块(堆:Young、Old 或 Permanent Generation)?
我尝试搜索,得到了使用 lambda 的语法,但无法理解 JVM 内部发生的情况,因为在 JAVA 中一切都是基于对象的。
那么在 OOP 的背景下 lambda 是如何工作的呢?
lambda 是否违反 OOP 概念?
Lambda 对垃圾收集器有好处吗,因为不会创建任何对象
不用担心内存问题和清理内存吗?
我不会浪费时间思考 lambda 表达式是否违反了 OO 原则。它的目标是增强语言的功能,而不是编写面向对象的代码,我不明白 lambda 会如何违反封装、继承或多态性。
This article http://blog.takipi.com/compiling-lambda-expressions-scala-vs-java-8/解释了 Java 如何处理 lambda 表达式:
Lambda 表达式的有趣之处在于,从 JVM 的角度来看,它们是完全不可见的。它不知道什么是匿名函数或 Lambda 表达式。它只知道字节码,这是严格的面向对象规范。语言的制造者及其编译器需要在这些限制下工作,以创建更新、更高级的语言元素。
考虑以下代码:
List names = Arrays.asList("1", "2", "3");
Stream lengths = names.stream().map(name -> name.length());
...它开始时非常简单地加载名称 var 并调用它的.stream()
方法,但它做了一些非常优雅的事情。它没有创建一个包装 Lambda 函数的新对象,而是使用新的invokeDynamic
Java 7 中添加的指令可动态将此调用站点链接到实际的 Lambda 函数。
aload_1 //load the names var
// call its stream() func
invokeinterface java/util/List.stream:()Ljava/util/stream/Stream;
//invokeDynamic magic!
invokedynamic #0:apply:()Ljava/util/function/Function;
//call the map() func
invokeinterface java/util/stream/Stream.map:
(Ljava/util/function/Function;)Ljava/util/stream/Stream;
InvokeDynamic
是 Java 7 中添加的一条指令,旨在降低 JVM 的严格性,并允许动态语言在运行时绑定符号,而不是在 JVM 编译代码时静态地执行所有链接。
拉姆达代码
aload_0
invokevirtual java/lang/String.length:()
invokestatic java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
areturn
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)