一个lambda表达式是否每次执行时都在堆上创建一个对象?当我使用Java 8的新语法糖遍历集合时,如myStream.forEach(item -> {
// do something useful});这不等同于下面的“旧语法”片段吗?myStream.forEach(new Consumer<Item>() {
@Override
public void accept(Item item) {
// do something useful
}});这是否意味着一个新的匿名者Consumer对象是在堆上每次迭代集合时创建的?这需要多少堆空间?它对性能有什么影响?这是否意味着我应该在大型多级数据结构上迭代时使用旧的循环样式?
3 回答
芜湖不芜
TA贡献1796条经验 获得超7个赞
这些规则旨在为Java编程语言的实现提供灵活性,因为:
不需要为每个评估分配一个新对象。
由不同的lambda表达式生成的对象不需要属于不同的类(例如,如果主体是相同的)。
由计算产生的每个对象不一定属于同一个类(例如,捕获的局部变量可能是内联的)。
如果“现有实例”可用,则不需要在以前的lambda计算中创建它(例如,它可能是在封闭类初始化期间分配的)。
侃侃无极
TA贡献2051条经验 获得超10个赞
forEach
forEach
这不等同于“旧语法”片段吗?
添加回答
举报
0/150
提交
取消