【问题标题】:Why are float and double lambda parameters restricted to the float value set, double value set?为什么 float 和 double lambda 参数仅限于 float 值集、double 值集?
【发布时间】:2018-01-20 19:21:48
【问题描述】:

阅读 Java 语言规范,Java SE 8 版,我在 §15.27.1 Lambda 参数中看到了一些有趣的东西:

float 类型的 lambda 参数始终包含浮点值集的元素(第 4.2.3 节);同样,double 类型的 lambda 参数始终包含双精度值集的元素。不允许 float 类型的 lambda 参数包含不是浮点值集元素的 float-extended-exponent 值集的元素,也不允许 double 类型的 lambda 参数包含双扩展指数值集的一个元素,它不是双精度值集的元素。

这似乎意味着 VM 将首先将扩展精度 floatdouble 值映射到通过值集转换设置的(非扩展)浮点或双精度值,然后再计算 lambda 表达式或 lambda 主体。但是,该规范没有要求对 lambda 的评估是 FP-strict,而且似乎不可能制作“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 值集内的原因是什么?

【问题讨论】:

  • 相同的语言出现在 Java 语言规范,Java SE 8 版中。
  • @JonathanRosenne 是的,你是对的。我并不是要暗示这是 JLS 9 中的新语言。

标签: java lambda jls


【解决方案1】:

阅读JSR-335 的最终草案,Lambda 规范的 B 部分紧跟“float 类型的 lambda 参数”段落之后提到:

前七段来源于8.4.1“形式参数”。

事实证明,第 8.4.1 节形式参数包括一个与方法和构造函数的参数有关的措辞相似的段落:

float 类型的方法或构造函数参数始终包含浮点值集的元素(第 4.2.3 节);同样,double 类型的方法或构造函数参数始终包含双精度值集的元素。不允许float 类型的方法或构造函数参数包含不是浮点值集的元素的浮点扩展指数值集的元素,也不允许double 类型的方法参数包含双扩展指数值集的一个元素,该元素不是双精度值集的元素。

我一路查到JLS 2,发现这一段一直都有。

所以,问题中的两个陈述实际上是等价的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2010-10-26
    • 2013-12-01
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多