繁体   English   中英

Java lambda匿名对象是否被重用?

[英]Is Java lambda anonymous object reused?

从当前的JDK 1.8实现开始,它构建一个匿名对象来保存lambda函数并在这样的对象上调用函数。 这个匿名对象是在每次调用中重用,还是每次都重新创建一个对象?

它可能会重复使用,也可能不会。

JLS 15.27.4开始

可以分配和初始化具有以下属性的类的新实例,也可以引用具有以下属性的类的现有实例。

你不能依赖它作为一个或另一个。 编译器和/或运行时可以选择能够提供最佳结果的那个。 (这是lambdas优于匿名类的好处之一 - 因为每次使用new ,即使在匿名类中,也保证它是一个新对象,它们无法通过重新使用它来优化它,即使99%的时间你不在乎它们是否是同一个物体。)

在lambda从周围范围捕获变量的情况下,通常不可能重新使用该对象,因为捕获的变量的值是存储在lambda对象中的状态,并且每次评估lambda时(即使它是它可以捕获捕获变量的不同值,在源代码中使用相同的lambda。 只有当编译器能够以某种方式保证lambda的两个特定评估必须捕获完全相同的变量值时,编译器才能重用该对象。

在lambda没有捕获任何变量的情况下,那个lambda的所有实例都在行为上是相同的。 因此,在这种情况下,可以将单个对象重新用于该lambda的所有评估。 我相信Java的当前实现在这种情况下仅在程序的持续时间内分配一个副本。 但这只是一种依赖于实现的优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM