阅读Java SE 8版Java语言规范后,我在§15.27.1Lambda Parameters中看到了一些有趣的东西:
float
类型的lambda参数始终包含浮点值集的一个元素(第4.2.3节);类似地,double
类型的lambda参数始终包含double值集的元素。不允许float
类型的lambda参数包含float-extended-exponent值集的元素,该元素既不是float值集的元素,也不允许double
类型的lambda参数包含omf的元素。 double-extended-exponent值集,它也不是double值集的元素。
这似乎暗示VM在评估lambda表达式或lambda主体之前,将首先通过值集转换将扩展精度的float
或double
值映射到(非扩展)float或double值集。但是,该规范没有要求将lambda评估为FP限制,并且似乎无法制作“strictfp
lambda表达式/正文”。
我想这意味着以下两个语句不是严格等效的:
doubleStream.map((operand) -> operand + 2.);
doubleStream.map(new DoubleUnaryOperator() {
@Override
public double applyAsDouble(double operand) {
return operand + 2.;
}
});
这样对吗?
为什么JLS要求
float
和double
lambda参数的值分别在float值集或double值集内? 最佳答案
在阅读JSR-335的最终草案时,Lambda规范的B部分立即在“float
类型的lambda参数”段落之后提到:
前面的七段来自8.4.1“形式参数”。
事实证明,第8.4.1节“形式参数”包含与方法和构造函数的参数有关的措词相似的段落:
float
类型的方法或构造函数参数始终包含浮点值集的一个元素(第4.2.3节);类似地,double
类型的方法或构造函数参数始终包含double值集的元素。不允许float
类型的方法或构造函数参数包含float-expended-exponent值集合的元素,该元素也不是float值集合的元素,也不允许double
类型的方法参数的元素包含一个元素既不是double值集的元素,也不是double扩展指数值集的值。
我一直检查到JLS 2,发现该段落一直存在。
因此,问题中的两个陈述实际上彼此相等。