【发布时间】:2016-01-28 05:09:54
【问题描述】:
我注意到与匿名类不同,在 lambda 的情况下不会创建新对象。有人可以帮我理解一下吗?
//case 1: anonymous class
for (int i = 0; i < 3; i++) {
Runnable r = new Runnable() { @Override public void run() { System.out.println("blah");}};
System.out.println("Anonymous: " + r.hashCode());
}
//case 2: lambdas
for (int i = 0; i < 3; i++) {
Runnable r = () -> System.out.println("blah");
System.out.println("Lambda: " + r.hashCode());
}
打印
Lambda: 1915503092
Lambda: 1915503092
Lambda: 1915503092
Anonymous: 1535128843
Anonymous: 1567581361
Anonymous: 849460928
【问题讨论】:
-
您认为为什么应该返回新对象?
-
@the8472,我是 Lambdas 的新手,我的印象是它只是匿名类的语法糖。因此,我期望它应该创建新对象。显然,JVM 足够聪明,不会为无状态 lambda 创建多个对象。
-
它们的代码大多类似于匿名内部类,但这并不意味着它们只是语法糖。你应该避免在未来做出这样的假设,还有其他细微的差异。
-
我现在知道了。谢谢@the8472。