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运行时而不进行修改?
通常,Javac编译器不可能使用高于目标JVM级别的源级别.因此答案是否定的.
正式没有,但对于非正式的解决方案,你应该看看Retrolambda项目.它不会向后移植Collection API更改,但它可以为您处理lambda表达式(和方法引用).
| 归档时间: |
|
| 查看次数: |
1822 次 |
| 最近记录: |