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

Aub*_*bin 83 java lambda java-8

我刚刚s在下面的lambda表达式中替换为_:

s -> Integer.parseInt(s)
Run Code Online (Sandbox Code Playgroud)

Eclipse编译器说:

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

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

Hol*_*ger 79

值得一看的地方是JLS§15.27.1.Lambda参数

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

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

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

  • 请注意,从Java 9开始,`_`将被禁止作为任何合法标识符名称,而不仅仅作为lambda参数名称.这实际上是在构建43中修复的:https://bugs.openjdk.java.net/browse/JDK-8061549 (21认同)
  • @Holger实际上有很多语言使用下划线作为名称占位符(Scala,Clojure,F#,SML,Erlang,仅举几例).我相信这是一种可追溯到90年代或80年代的既定模式,所以不服从它是奇怪的. (10认同)
  • @ArturoTorresSánchez:这不是什么新鲜事.有时`enum`和`assert`是合法标识符...... (8认同)
  • 这是什么?Java打破向后兼容性? (5认同)
  • @lscoughlin:不是"Java编程语言的未来版本可能会保留这个名称作为关键字和/或赋予它特殊的语义"声明吗?好吧,用"将使用"替换"可以保留",你就可以了解情况.也许[这个邮件参考](http://mail.openjdk.java.net/pipermail/lambda-dev/2013-July/010670.html)帮助...... (3认同)
  • @lscoughlin:它似乎受到Scala编程语言的启发.除了接近其他语言之外,它没有任何理由弃用标识而不是使用当前未使用的特殊字符之一,例如`#`,`§`或`` (3认同)
  • 我找不到任何关于为什么的参考? (2认同)
  • 苹果Swift使用下划线。下划线可以放在方法参数名称之前。这使得在调用方法时无需编写变量名。 (2认同)
  • 根据记录,这是一个_编译时_兼容性中断。这不会破坏现有类的运行时向后兼容性。 (2认同)

Ale*_*aux 13

它是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,方法或catch正式参数.

  • 我现在使用的是 Java 14,但仍然无法使用下划线作为未命名的 lambda 参数。无论日本共产党想要实现什么目标,他们似乎都达到了相反的目标。 (5认同)
  • Brian Goetz 在 [他的 Devoxx 演讲 2017-11](https://youtu.be/qul2B8iPC-o?t=43m1s) 中讨论了这种用法,关于 [Project Amber](http://openjdk.java.net/项目/琥珀色/)。 (3认同)
  • 我们目前使用“$”来实现此目的。 (2认同)

Ang*_*Koh 5

Java SE 9的Java语言更改 https://docs.oracle.com/javase/9​​/language/toc.htm#JSLAN-GUID-16A5183A-DC0D-4A96-B9D8-AAC9671222DD

从Java 9开始,_字符不能再用作标识符,而不仅仅是在lambda上下文中

下划线字符不是合法名称.

如果使用下划线字符("_")作为标识符,则无法再编译源代码.