为了减少由众多匿名类型的实例化引起的混乱,我正在探索利用Java 8 lambda的可能性。
在生产环境中使用Java
8和lambda之前,一个重要的考虑因素是使用lambda表达式的JDK8编译代码是否可以在Java运行时的早期版本上执行。我对JRE6和JRE7作为目标平台特别感兴趣。
一方面,我了解到lambda只是围绕包含一个方法的匿名类的实例化的语法糖。另一方面,我不确定这种等效性是否意味着为每个生成的字节码在除JRE8之外的所有JVM版本中都是相同和/或兼容的。
例如,给定单方法接口:
public interface Action {
public void perform(T argument);
}
以下两个片段在功能上是等效的:
使用lambda:
final Action y = i -> System.out.println(i);
使用匿名类实例:
final Action y = new Action() {
@Override
public void perform(final String i) {
System.out.println(i);
}
};
我的具体问题是两个结构的 语义对 等是否扩展到其 编译表示的对等
。此外,如果它们确实等效编译,这种等效性是否表示可以将lambda表达式的编译形式托管在Java运行时的早期版本中而无需进行修改?