我刚刚用s
替换了以下lambda表达式中的_
:
s -> Integer.parseInt(s)
Eclipse编译器说:
'_'不应该用作标识符,因为它是来自源级别1.8的保留关键字。
我在JLS §3.9词汇结构/关键字中找不到任何解释。
答案 0 :(得分:79)
要看的地方是JLS §15.27.1. Lambda Parameters
如果lambda参数的名称为_(即单个下划线字符),则为编译时错误。
不鼓励在任何上下文中使用变量名_。 Java编程语言的未来版本可以将此名称保留为关键字和/或赋予其特殊语义。 功能
因此,Eclipse消息具有误导性,尤其是当为lambda参数生成错误或为任何其他_
标识符生成警告时,两种情况都使用相同的消息。
答案 1 :(得分:10)
这是JEP 302的第2阶段,它将添加下划线作为特殊字符,以表示lambda表达式中未使用的参数。
下划线的处理
在许多语言中,通常使用下划线(
_
)来表示未命名的lambda参数(方法和异常参数也是如此):
BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);
这可以对未使用的参数进行更强的静态检查,还可以将多个参数标记为未使用。但是,由于下划线是Java 8以来的有效标识符,因此兼容性要求我们采取更间接的途径来获取下划线可以在Java中担当此角色的位置。第1阶段禁止在Java 8中将下划线用作lambda形式参数名称(这不会产生兼容性,因为lambda以前不存在),并且在其他位置使用下划线作为标识符已发出警告。当此警告变为错误时,阶段2进入Java 9。现在,我们可以自由完成下划线的计划修复,以指示未使用的lambda,方法或捕获形式参数。
答案 2 :(得分:5)
Java SE 9的Java语言更改 https://docs.oracle.com/javase/9/language/toc.htm#JSLAN-GUID-16A5183A-DC0D-4A96-B9D8-AAC9671222DD
从Java 9开始,_字符不能再用作标识符,而不仅仅是在lambda上下文中
下划线字符不是合法名称。
如果您使用下划线字符(“_”)作为标识符,则无法再编译源代码。