Java 8引入了重要的新语言功能,例如lambda表达式.
语言中的这些更改是否伴随着编译的字节码中的这些重大更改,这些更改会阻止它在不使用某些反向转换器的情况下在Java 7虚拟机上运行?
Loop.times(5, () -> {
System.out.println("looping");
});
Run Code Online (Sandbox Code Playgroud)
哪些有效编译到?
for(int i = 0; i < 5; i++)
System.out.println("looping");
Run Code Online (Sandbox Code Playgroud)
或类似的东西
new CallableInterfaceImpl(){
public void call(){
for(int i = 0; i < 5; i++)
System.out.println("looping");
}
}.call();
Run Code Online (Sandbox Code Playgroud)
它会替换(内联类),还是实际创建一个匿名类?
我有点困惑.
Oracle称Java 8与Java 7高度兼容(向后).但是,Java 8程序可以在Java 7上成功运行(SE/EE)的可能性有多大?
如果第一点是真的,Java 8应用程序将在Java 7服务器支持上部署和执行?例如,Tomcat 8还是WildFly?
例如,在匿名内部类的情况下,传递(匿名)对象引用并执行该对象的方法.
Lambdas是将在需要时执行的代码块.
遇到lambdas时JVM中会发生什么?JVM在哪里存储与lambdas相关的代码块(Heap:Young,Old或Permanent Generation)?
我尝试搜索,我得到了使用lambdas的语法但是无法理解JVM中发生的事情,因为在JAVA中,一切都是基于对象的.
所以在OOP的背景下,lambda是如何工作的?
lambda违反了OOP概念吗?
Lambda是否适合垃圾收集器,因为没有创建对象因此不用担心内存问题和清除内存?
为了减少由匿名类型的大量实例化引起的混乱,我正在探索利用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运行时而不进行修改?
最近,我们将Jdk版本升级1.6到1.8我的一个Java项目中.但是有一些编译或运行时错误,所以我必须升级一些库:
1.9to1.103.x到4.x那是因为他们使用的是早期版本的ASM,但仅支持jdk 1.8 5.x
Java表示它是向后兼容的,但为什么原始版本的库无法直接与jdk 1.8一起使用?