阅读Java语言规范Java SE 8版,我在§15.27.1中看到了一些有趣的内容:Lambda参数:
类型
float
的lambda参数始终包含浮点值集的元素(第4.2.3节);类似地,类型double
的lambda参数始终包含double值集的元素。类型float
的lambda参数不允许包含float-extended-exponent值集的元素,该元素也不是float值集的元素,也不允许类型为{{1的lambda参数包含double-extended-exponent值集的元素,该元素也不是double值集的元素。
这似乎意味着VM将首先通过lambda表达式或lambda之前的值集转换将扩展精度double
或float
值映射到(非扩展)float或double值集评估身体。但是,规范不要求将lambda评估为FP严格,并且看起来不可能制作“double
lambda表达式/ body”。
我认为这意味着以下两个陈述并不严格等同:
strictfp
这是对的吗?
JLS要求doubleStream.map((operand) -> operand + 2.);
doubleStream.map(new DoubleUnaryOperator() {
@Override
public double applyAsDouble(double operand) {
return operand + 2.;
}
});
和float
lambda参数的值分别在浮点值集或双值集内的原因是什么?
答案 0 :(得分:2)
阅读JSR-335的最终草案,Lambda规范的B部分紧跟在“float
类型的{lambda参数”段落之后提到:
前七段来自8.4.1“形式参数”。
事实证明,§8.4.1形式参数包含一个与方法和构造函数参数有关的措辞相似的段落:
类型
float
的方法或构造函数参数始终包含浮点值集的元素(第4.2.3节);类似地,类型double
的方法或构造函数参数始终包含double值集的元素。类型float
的方法或构造函数参数不允许包含float-extended-exponent值集的元素,该元素也不是float值集的元素,也不允许类型{的方法参数{1}}包含double-extended-exponent值集的元素,该元素也不是double值集的元素。
我一直检查回JLS 2,看到这一段一直存在。
因此,问题中的两个陈述实际上是彼此等同的。