在当前的 JDK 1.8 实现中,它构建了一个匿名对象来保存 lambda 函数并在该对象上调用该函数。这个匿名对象是在每次调用中重复使用,还是每次都重新创建一个对象?
最佳答案
它可能会被重复使用,也可能不会。
来自 JLS 15.27.4 :
Either a new instance of a class with the properties below is allocated and initialized, or an existing instance of a class with the properties below is referenced.
你不能指望它是其中之一。编译器和/或运行时可以选择能够提供最佳结果的那个。 (这是 lambda 相对于匿名类的好处之一——因为每次你使用 new
时,即使是在匿名类上,它也保证是一个新对象,它们无法通过重复使用它,即使 99% 的时间你不关心它们是否是同一个对象。)
在 lambda 从周围范围捕获变量的情况下,通常不可能重新使用该对象,因为捕获变量的值是状态存储在 lambda 对象中,并且每次对 lambda 求值(即使它在源代码中是相同的 lambda),它也可能捕获捕获变量的不同值。只有当编译器能够以某种方式保证 lambda 的两次特定计算必须捕获完全相同的变量值时,编译器才能重用该对象。
在 lambda 不捕获任何变量的情况下,该 lambda 的所有实例化在行为上都是相同的。所以在这种情况下,单个对象可以重新用于该 lambda 的所有评估。我相信在这种情况下,当前的 Java 实现只会在程序运行期间分配一个副本。但这只是一个依赖于实现的优化。
关于java - Java lambda 匿名对象是否被重用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28452289/