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

bnu*_*bnu 13 java lambda backwards-compatibility java-8

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

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

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

例如,给定单方法接口:

public interface Action<T> {
    public void perform(T argument);
}
Run Code Online (Sandbox Code Playgroud)

以下两个片段在功能上是等效的:

使用lambda:

final Action<String> y = i -> System.out.println(i);
Run Code Online (Sandbox Code Playgroud)

使用匿名类实例:

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

我的具体问题是两种结构的语义等价是否扩展到其编译表示的等价性.此外,如果它们确实等价地编译,那么这个等价是否表明lambda表达式的编译形式可以托管在早期版本的Java运行时而不进行修改?

ant*_*tix 8

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

  • 除了目标JVM级别(实际上是类文件版本)之外,lambdas还需要Java 7中添加的Java 7中不存在的运行时支持. (5认同)
  • Javac不支持为较旧的JVM编译较新的语言功能.所有以前的版本都是如此,AFAIK也适用于Java 8.请参阅:http://stackoverflow.com/questions/18320587/javac-cross-compilation-with-1-7.一般是因为Javac不是唯一的编译器,所以有人可能会构建一个支持它的编译器. (2认同)

sea*_*anf 7

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

  • 进行良好的单元测试并在已处理的类上运行它们.如果retrolambda中存在错误,您需要事先了解它. (2认同)