编译器如何在Java中翻译lambda表达式?

编译器如何在Java中翻译lambda表达式?,java,lambda,java-8,Java,Lambda,Java 8,我想知道的是,编译器是如何实现该语句的 ->98.6//报表1 上述声明相当于 //Code 1 interface Demo { double myMeth(); } class MyClass { public static void main(String args[]) { Demo myDemo = () -> 98.6; } } 那么,编译器是否在编译期间用代码2替换语句1 或者编译器做了其他的事情?在语义上,虽然不是实现上,但基本

我想知道的是,编译器是如何实现该语句的

->98.6//报表1

上述声明相当于

//Code 1

interface Demo {
    double myMeth();
}

class MyClass {
    public static void main(String args[]) {
        Demo myDemo = () -> 98.6;
    }
}
那么,编译器是否在编译期间用代码2替换语句1


或者编译器做了其他的事情?

在语义上,虽然不是实现上,但基本上与

//Code 2

double myMeth() {
    return 98.6;
}

编译器实际上不会将lambda表达式转换为匿名类创建表达式。Lambda表达式以更高效的方式实现。

阅读本文:尝试使用javap-c-v-pmyclass.class反编译类文件,您可以自己查看!Lambda表达式的语义也与内部类实例不同。lambdas主体内的名称含义被区别对待,无需梳理查找;lambda表达式的标识语义也不同于匿名类创建表达式的标识语义。
class MyClass {
    public static void main(String args[]) {
        Demo myDemo = new Demo() {
            public double myMeth() {
                return 98.6;
            }
        };
    }
}