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

标签 java lambda anonymous-class

在当前的 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/

相关文章:

java - RxJava 2.x : Should I use Flowable or Single/Completable?

java - 如何在 spring boot 中使用 spring web 服务动态 WSDL 生成?

python - 解释 lambda argparse.HelpFormatter(prog, width)

c++ - Lambda 返回空字符串

java - 有什么方法可以使用 junit 测试匿名内部类吗?

java - 对匿名类与匿名内部类感到困惑

java - 编译阶段后通过 Maven 插件生成新源

java - 有没有办法使用 C++ 从 Java 进程中读取值?

C# Lambda 到 VB.Net

php - PHP7 匿名类中的静态属性