我刚刚将以下 lambda 表达式中的
s
替换为 _
:
s -> Integer.parseInt(s)
Eclipse 编译器说:
'_' 不应该用作标识符,因为它是源代码级别 1.8 开始的保留关键字。
我在JLS §3.9词汇结构/关键词中没有找到任何解释。
查看的地方是JLS §15.27.1。 Lambda 参数
如果 lambda 参数的名称为 _(即单个下划线字符),则会出现编译时错误。
不鼓励在任何上下文中使用变量名 _。 Java 编程语言的未来版本可能会保留该名称作为关键字和/或赋予它特殊的语义。
因此 Eclipse 消息具有误导性,特别是当为 lambda 参数生成错误或为任何其他
_
标识符生成警告时,这两种情况使用相同的消息。
这是JEP 302的第二阶段,将添加下划线作为特殊字符来表示 lambda 表达式中未使用的参数。
下划线的处理
在许多语言中,通常使用下划线 (
) 来表示未命名的 lambda 参数(方法和异常参数也类似):_
BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);
这允许对未使用的参数进行更强有力的静态检查,并且还允许将多个参数标记为未使用。然而,由于下划线是 Java 8 中的有效标识符,因此兼容性要求我们采取更间接的途径来实现下划线在 Java 中发挥这一作用的位置。第 1 阶段禁止在 Java 8 中将下划线作为 lambda 形式参数名称(这没有兼容性后果,因为以前不存在 lambda),并且针对在其他地方使用下划线作为标识符发出了警告。 Java 9 中出现了第 2 阶段,此时此警告变成了错误。我们现在可以自由地完成下划线的计划修复,以指示未使用的 lambda、方法或 catch 形式参数。
Java SE 9 的 Java 语言更改 https://docs.oracle.com/javase/9/language/toc.htm#JSLAN-GUID-16A5183A-DC0D-4A96-B9D8-AAC9671222DD
从 Java 9 开始,_ 字符不能再用作标识符,而不仅仅是在 lambda 上下文中
下划线字符不是合法名称。
如果您使用下划线字符(“_”)作为标识符,您的源代码将无法再编译。
随着 Java 的发展,下划线字符呈现出一种特殊的新含义:省略
record
组件的类型和名称。
作为 Java 21 中的预览功能,我们看到下划线字符用于:
请参阅 JEP 443:未命名模式和变量(预览)。
下划线字符 (
_
) 是十进制代码点 95,十六进制代码点 5F。在 Unicode标准中正式命名为
LOW LINE
。
使用下划线作为标识符会抛出:
参见:JEP 213:铣削项目硬币。