每次调用时 Lambda 表达式都会给堆带来对象负担吗?
在现代 Java 生态系统中,lambda 表达式已成为一种强大的工具简洁而富有表现力的编码。然而,使用 lambda 表达式时出现的一个问题是它们对堆内存消耗的潜在影响。每次执行 lambda 表达式都会在堆上创建一个不同的对象吗?
将 Lambda 与匿名类语法进行比较
让我们考虑以下 lambda 表达式:
myStream.forEach(item -> { // do something useful });
这在功能上等价于下面的匿名类吗方法?
myStream.forEach(new Consumer<Item>() { @Override public void accept(Item item) { // do something useful } });
答案是肯定的,两种方法具有相同的功能行为。然而,实现细节却截然不同。
Lambda 表达式的内部细节
Lambda 表达式的行为由 JVM 实现控制。 Oracle 的 JVM 遵循特定的方法:
此方法可确保对于不修改外部状态的简单 lambda 表达式,堆空间不会被浪费。
性能影响
在大多数实际场景中,lambda 表达式的开销可以忽略不计。对象的创建,特别是没有值捕获的简单 lambda 表达式,经过 JIT 编译器的高度优化。
最佳实践
而 lambda 表达式的堆消耗为通常不是一个问题,在嵌套或复杂的数据结构中明智地使用它们仍然是一个很好的做法。在这种情况下,使用传统循环可能会带来更好的性能。
总之,Java 中的 lambda 表达式通常不会在每次执行时在堆上创建新对象,除非它们捕获外部值。 JVM 实现确保简单 lambda 表达式的单例实例的高效重用,最大限度地减少堆空间消耗和性能影响。
以上是Java Lambda 表达式是否会为每次调用在堆上创建一个新对象?的详细内容。更多信息请关注PHP中文网其他相关文章!