Java lambda表达式每次执行时是否在堆上创建一个对象?

当我使用Java 8的新语法糖遍历集合时,例如

myStream.forEach(item -> {

// do something useful

});

这不等同于下面的“旧语法”代码段吗?

myStream.forEach(new Consumer<Item>() {

@Override

public void accept(Item item) {

// do something useful

}

});

这是否意味着Consumer每次迭代集合时都会在堆上创建一个新的匿名对象?这需要多少堆空间?它对性能有什么影响?这是否意味着在遍历大型多级数据结构时,我宁愿使用旧样式的循环?

回答:

它是等效的但不相同。简而言之,如果lambda表达式未捕获值,则它将是单例,可在每次调用时重复使用。

行为没有完全指定。JVM被赋予了很大的自由来实现它。当前,Oracle的JVM为每个lambda表达式创建(至少)一个实例(即不在不同的相同表达式之间共享实例),但为所有不捕获值的表达式创建单例。

你可以阅读此答案以获取更多详细信息。在那里,我不仅给出了更详细的描述,还提供了测试代码以观察当前行为。

以上是 Java lambda表达式每次执行时是否在堆上创建一个对象? 的全部内容, 来源链接: utcz.com/qa/426616.html

回到顶部