_(下划线)是保留关键字


92

我刚刚s在以下lambda表达式中替换为_

s -> Integer.parseInt(s)

Eclipse编译器说:

'_'不应用作标识符,因为它是源级别1.8以后的保留关键字。

我没有在JLS§3.9词法结构/关键字中找到任何解释。

Answers:


83

看的地方是JLS§15.27.1。Lambda参数

如果lambda参数名称为_(即单个下划线字符),则是编译时错误。

不建议在任何上下文中使用变量名_。Java编程语言的未来版本可能将此名称保留为关键字和/或赋予其特殊的语义。

因此,Eclipse消息具有误导性,尤其是在两种情况下都使用相同的消息,即为lambda参数生成错误或为任何其他_标识符生成警告时。


21
请注意,从Java 9开始,_不允许将其用作任何合法标识符名称,而不仅限于lambda参数名称。这实际上在构建43中已修复:bugs.openjdk.java.net/browse/JDK-8061549 –Jean
-FrançoisSavard

3
@lscoughlin:“ Java编程语言的未来版本可能会将此名称保留为关键字和/或赋予它特殊的语义”语句吗?好吧,将“可能保留”替换为“将使用”,您将获得图片。也许此邮件参考对您有帮助……
Holger

5
这是什么?Java是否会向后兼容?
Arturo TorresSánchez2015年

8
@Arturo TorresSánchez:没什么新鲜的。有时enum并且assert是合法标识符……
Holger 2015年

11
@Holger实际上有成千上万种使用下划线作为名称占位符的语言(Scala,Clojure,F#,SML,Erlang,仅举几例)。我认为,这是一个可以追溯到90或80年代的既定模式,因此不遵守它是很奇怪的。
om-nom-nom

23

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,方法或捕获形式参数。


1
Brian Goetz在2017年11月的Devoxx演讲中讨论Amber项目,讨论了这种用法。
罗勒·布尔克

好的,但是在J8中表示未使用的参数的替代方法是什么?那根本不可能吗?
曼努埃尔

1
我们目前$为此目的使用。
aventurin

我现在使用的是Java 14,但仍然不能使用下划线作为未命名的lambda参数。无论JCP打算实现什么目标,似乎他们都取得了相反的成就。
弗朗斯

@Frans请注意,JEP(截至今天)仅处于候选阶段。尚未完成。有关JEP流程的更多详细信息,请参见JEP 1
Alexandre de Champeaux

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.