Dol*_*000 5 java lambda java-8
用于LambdaMetaFactoryJava 1.8的JavaDoc指定lambda捕获"可能涉及分配新的函数对象,或者可能返回现有的函数对象",但它没有指定何时以及在何种情况下它可以选择一种方式或另一种方式.
LambdaMetaFactory另一方面,看看实际的实现,很明显,当且仅当lambda表达式没有捕获参数时才会发生.
我想知道的是,这个行为实际上是在某个地方指定的(在JavaDoc之外)并且可以依赖吗?很高兴知道我是否可以依赖lambda表达式的身份是否恒定.
基本上没有合同涵盖评估lambda表达式所产生的对象的身份.这在JLS第15.27.4节"Lambda表达式的运行时评估"中有所介绍.本节明确地未指定创建与lambda对象重用的确切行为.该部分的基本原理很好地解释了这一点:
这些规则旨在为Java编程语言的实现提供灵活性,其中:
不需要在每次评估时分配新对象.
由不同的lambda表达式生成的对象不需要属于不同的类(例如,如果主体是相同的).
评估产生的每个对象不必属于同一个类(例如,捕获的局部变量可能被内联).
如果"现有实例"可用,则无需在先前的lambda评估中创建它(例如,它可能在封闭类的初始化期间分配).
当然,您可以尝试实现,调用equals()或使用==lambda对象,将它们放入IdentityHashMaps等等,但由于这些确切的行为未指定,因此当您运行不同版本的程序时,您的程序可能会改变其行为(即中断) JDK或Java SE的不同实现.
我在下面的评论中读到了这个问题的交换,但我真的没有什么可以提供的.也许如果你解释一下你想要做什么,我们可以提出一些建议来替代使用lambdas作为地图中的键.
| 归档时间: |
|
| 查看次数: |
609 次 |
| 最近记录: |