编译的 Java 8 lambda 表达式是否向后兼容早期版本的 Java 运行时?

为了减少匿名类型的大量实例化造成的混乱,我正在探索利用Java 8 lambdas的可能性。

在生产环境中使用 Java 8 和 lambda 之前的一个重要考虑因素是,使用 lambda 表达式的 JDK8 编译代码是否可以在早期版本的 Java 运行时上执行。我对JRE6和JRE7作为目标平台特别感兴趣。

一方面,我理解lambda只是围绕包含一个方法的匿名类的实例化的语法糖。另一方面,我不确定这种等效性是否意味着为每个字节码生成的字节码在JRE8以外的JVM版本之间是相同和/或兼容的。

例如,给定单方法接口:

public interface Action<T> {
    public void perform(T argument);
}

以下两个代码段在“功能上”是等效的:

使用 lambda:

final Action<String> y = i -> System.out.println(i);

使用匿名类实例:

final Action<String> y = new Action<String>() {
    @Override
    public void perform(final String i) {
        System.out.println(i);
    }
};

我的具体问题是,两种结构的语义等价性是否延伸到它们编译的表示的等价性。此外,如果它们确实等效地编译,这种等效性是否表明 lambda 表达式的编译形式可以托管在早期版本的 Java 运行时上而无需修改?


答案 1

通常,Javac 编译器不可能使用高于目标 JVM 级别的源代码级别。因此,答案是否定的。


答案 2

正式的不是,但对于非官方的解决方案,你应该看看Retrolambda项目。它不会向后移植集合 API 更改,但它可以为您处理 lambda 表达式(和方法引用)。


推荐