Java 8中箭头运算符的内部工作原理是什么?

5

我知道箭头的左边是参数,右边是函数,参数会传到函数中。但是我想知道Java 8如何把左侧和右侧进行映射并转换为函数。在这个过程中发生了什么,我在哪里可以找到相关的信息?


1
这是一个Lambda表达式 - Cᴏʀʏ
请查看以下链接:http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html,http://viralpatel.net/blogs/lambda-expressions-java-tutorial/ - CodeWarrior
1个回答

7
当你有一个->时,javac编译器会添加一个静态方法来包含代码的内容。它还向类中添加了动态调用站点信息,以便JVM可以将lambda实现的接口映射到参数和返回类型。JVM在运行时生成代码来将接口绑定到生成的方法。
与匿名类不同的是,隐式变量只需要是有效的final(即可能已经被声明为final),而成员变量则被复制,即它不保留外部类的this引用。
即使两者都不需要参数,它也可以区分RunnableCallable<void>之间的差异。了解更多详情请查阅http://vanillajava.blogspot.com/2014/09/lambdas-and-side-effects.html

1
很棒的文章! - Luiggi Mendoza
@LuiggiMendoza 干杯。 :) - Peter Lawrey
3
本地变量被匿名内部类捕获时,只需要是有效的 final 即可,不需要显式声明为 final。这与 lambda 表达式相似,并且是 Java 8 相对于之前版本的一种放宽限制。Lambda 表达式也会捕获封闭实例,但只有在某些情况下才需要捕获。您说得对,没有捕获的 lambda 表达式不会捕获封闭实例,而即使可能没有必要,AICs 仍将捕获它们。 - Stuart Marks
1
据我所知,Lambda实现方法不需要是“静态”的。例如,捕获“this”的Lambda可以使用实例方法来实现,但是当前的编译器并没有利用这个机会。 - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接