我刚刚将以下lambda表达式中的s
替换为_
:
s -> Integer.parseInt(s)
Eclipse编译器表示:
不能将“_”用作标识符,因为它是从1.8源级别起的保留关键字。
在JLS §3.9词法结构/关键字中没有找到任何解释。
需要查找的地方是JLS §15.27.1. Lambda Parameters
如果lambda参数的名称为_(即一个下划线字符),则会发生编译时错误。
在任何情况下都不建议使用变量名“_”。未来版本的Java编程语言可能会将此名称保留为关键字和/或赋予其特殊语义。
因此,Eclipse的消息是误导性的,特别是由于相同的消息用于两种情况:当生成lambda参数的错误时或者当为任何其他_
标识符生成警告时。
这是JEP 302的第二阶段,它将添加下划线作为特殊字符来表示 lambda 表达式中未使用的参数。
下划线的处理
许多语言都常使用下划线(
_
)表示未命名的 lambda 参数(方法和异常参数同理):
BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);
这样可以更强地静态检查未使用的参数,并且允许标记多个参数未使用。但由于在 Java 8 中下划线是有效的标识符,所以兼容性要求我们采取更间接的方式使其在 Java 中扮演此角色。第一阶段是在 Java 8 中禁止下划线作为 lambda 形式参数名称(因为之前不存在 lambda,所以这不会影响兼容性),并对在其他位置使用下划线作为标识符发出警告。第二阶段在 Java 9 中进行,当该警告成为错误时。现在,我们可以自由地完成计划中的下划线恢复,以表示未使用的 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的演变,下划线字符具有了特殊的新含义:省略记录组件的类型和名称。
在Java 21中的预览功能中,我们可以看到下划线字符用于:
_
)的代码点是95十进制,5F十六进制。在Unicode标准中正式命名为LOW LINE
。
_
将不再被允许作为任何合法的标识符名称,而不仅仅是用作lambda参数名称。实际上,这个问题已经在build 43中得到修复:https://bugs.openjdk.java.net/browse/JDK-8061549 - Jean-François Savardenum
和assert
也是合法的标识符......” - Holger