【发布时间】:2014-03-22 01:23:24
【问题描述】:
为了减少大量匿名类型实例化造成的混乱,我正在探索利用 Java 8 lambdas 的可能性。
在生产环境中使用 Java 8 和 lambda 之前的一个重要考虑因素是,使用 lambda 表达式的 JDK8 编译代码是否可以在早期版本的 Java 运行时上执行。我对 JRE6 和 JRE7 作为目标平台特别感兴趣。
一方面,我知道 lambda 只是围绕包含一个方法的匿名类的实例化的语法糖。另一方面,我不确定这种等效性是否意味着为每个生成的字节码在 JRE8 以外的 JVM 版本之间是相同和/或兼容的。
例如,给定单方法接口:
public interface Action<T> {
public void perform(T argument);
}
以下两个 sn-ps 在“功能上”是等效的:
使用 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 运行时的早期版本上托管而无需修改?
【问题讨论】:
-
可以让 lambdas 在 Java 7 VM 上工作,但官方编译器不这样做。
-
IMO 最好将您的 JRE 升级到 Java 8,而不是尝试使用技巧或 hack 使 lambda 在 JRE6/7 上工作;不仅因为您随后获得了 Java 8 功能,还因为 JRE 6 和 7 已停产,将不再从 Oracle 获得任何免费(安全)更新。
-
另外,JDK 8 编译器不会将 lambda 转换并编译为匿名类;它使用更有效的表示,因此不需要匿名类。
标签: java lambda backwards-compatibility java-8