在Java8中,箭头操作符是如何在内部工作的?

在Java8中,箭头操作符是如何在内部工作的?,java,java-8,Java,Java 8,我知道箭头的左边有参数,箭头的右边是参数指向的函数。但是,我想知道Java8如何映射左侧和右侧,并将其转换为函数。那里发生了什么?在哪里可以找到信息?当您有一个->时,javac编译器会添加一个包含代码内容的静态方法。它还向类添加动态调用端信息,以便JVM可以将lambda实现的接口映射到参数和返回类型。JVM在运行时生成代码,将接口绑定到生成的方法 与lambdas和匿名类的区别在于,隐式变量只需要是有效的final(如中可能已成为final),并且成员变量被复制,即它不保留对外部类的this

我知道箭头的左边有参数,箭头的右边是参数指向的函数。但是,我想知道Java8如何映射左侧和右侧,并将其转换为函数。那里发生了什么?在哪里可以找到信息?

当您有一个
->
时,javac编译器会添加一个包含代码内容的静态方法。它还向类添加动态调用端信息,以便JVM可以将lambda实现的接口映射到参数和返回类型。JVM在运行时生成代码,将接口绑定到生成的方法

与lambdas和匿名类的区别在于,隐式变量只需要是有效的final(如中可能已成为final),并且成员变量被复制,即它不保留对外部类的
this
的引用


它可以区分
Runnable
Callable
之间的区别,即使两者都不带参数。有关更多详细信息

这是一篇很好的文章。请看下面这篇文章@LuiggiMendoza干杯。:)匿名内部类捕获的局部变量只需要是有效的final,而不需要显式声明final。这类似于lambdas,在Java8中是对以前版本的放松。Lambdas还将捕获封闭的实例,但仅当需要捕获时。但是,您是正确的,不捕获lambda不会捕获封闭实例,而AICs会捕获封闭实例,即使它可能是不必要的。据我所知,lambda实现方法不要求是
静态的
。例如,可以使用实例方法实现lambdas捕获,但是,当前的编译器不使用此机会。