阅读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主体之前,将首先通过值集转换将扩展精度的floatdouble值映射到(非扩展)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要求floatdouble 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,发现该段落一直存在。

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

07-24 15:54