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