为什么float和double lambda参数限制为浮点值设置,双值设置?

时间:2018-01-20 19:21:49

标签: java lambda jls

阅读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之前的值集转换将扩展精度doublefloat值映射到(非扩展)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参数的值分别在浮点值集或双值集内的原因是什么?

1 个答案:

答案 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,看到这一段一直存在。

因此,问题中的两个陈述实际上是彼此等同的。