【发布时间】: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 将首先将扩展精度 float 或 double 值映射到通过值集转换设置的(非扩展)浮点或双精度值,然后再计算 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 要求 float 和 double lambda 参数的值分别在 float 值集或 double 值集内的原因是什么?
【问题讨论】:
-
相同的语言出现在 Java 语言规范,Java SE 8 版中。
-
@JonathanRosenne 是的,你是对的。我并不是要暗示这是 JLS 9 中的新语言。