我刚刚将下面lambda表达式中的s替换为_:
s
_
s -> Integer.parseInt(s)
Eclipse compiler说道:“_”不应用作标识符,因为它是源代码级别1.8以上的保留关键字。我在JLS §3.9词汇结构/关键词中没有找到任何解释。
fjnneemd1#
要查看的地方是JLS §15.27.1。Lambda参数
如果lambda参数的名称为_(即单个下划线字符),则为编译时错误。
不鼓励在任何上下文中使用变量name _。Java编程语言的未来版本可能会将此名称保留为关键字和/或给予特殊的语义。所以Eclipse消息是误导性的,特别是当两种情况下使用相同的消息时,当为lambda参数生成错误时,或者当为任何其他_标识符生成警告时。
hfsqlsce2#
这是JEP 302的第2阶段,它将添加下划线作为特殊字符来表示lambda表达式中未使用的参数。
在许多语言中,通常使用下划线(_)来表示未命名的lambda参数(方法和异常参数也是如此):BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);这允许对未使用的参数进行更强的静态检查,还允许将多个参数标记为未使用。然而,由于下划线在Java 8中是一个有效的标识符,兼容性要求我们采取一种更间接的方式来实现下划线在Java中的作用。第一阶段禁止在Java 8中使用下划线作为lambda形式参数名(这没有兼容性后果,因为lambda以前不存在),并对在其他地方使用下划线作为标识符发出警告。第二阶段是在Java 9中,当这个警告变成错误时。我们现在可以自由地完成下划线的计划恢复,以指示未使用的lambda,方法或catch形式参数。
BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);
tez616oj3#
Java SE 9的Java语言更改https:docs.oracle.com/javase/9/language/toc.htm#JSLAN-GUID-16A5183A-DC0D-4A96-B9D8-AAC9671222DD
从Java 9开始,字符不能再作为标识符使用,不仅仅是在lambda上下文中下划线字符不是法律的的名称。如果使用下划线字符(“”)作为标识符,则无法再编译源代码。
omhiaaxx4#
随着Java的发展,下划线字符有了新的特殊含义。
作为Java 21中的预览功能,我们可以看到下划线字符用于:
参见JEP 443: Unnamed Patterns and Variables (Preview)。
下划线字符(_)是十进制代码点95,十六进制5 F。在Unicode标准中正式命名为LOW LINE。使用下划线作为标识符会引发:
LOW LINE
参见:JEP 213: Milling Project Coin。
4条答案
按热度按时间fjnneemd1#
要查看的地方是JLS §15.27.1。Lambda参数
如果lambda参数的名称为_(即单个下划线字符),则为编译时错误。
不鼓励在任何上下文中使用变量name _。Java编程语言的未来版本可能会将此名称保留为关键字和/或给予特殊的语义。
所以Eclipse消息是误导性的,特别是当两种情况下使用相同的消息时,当为lambda参数生成错误时,或者当为任何其他
_
标识符生成警告时。hfsqlsce2#
这是JEP 302的第2阶段,它将添加下划线作为特殊字符来表示lambda表达式中未使用的参数。
下划线的处理
在许多语言中,通常使用下划线(
_
)来表示未命名的lambda参数(方法和异常参数也是如此):BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);
这允许对未使用的参数进行更强的静态检查,还允许将多个参数标记为未使用。然而,由于下划线在Java 8中是一个有效的标识符,兼容性要求我们采取一种更间接的方式来实现下划线在Java中的作用。第一阶段禁止在Java 8中使用下划线作为lambda形式参数名(这没有兼容性后果,因为lambda以前不存在),并对在其他地方使用下划线作为标识符发出警告。第二阶段是在Java 9中,当这个警告变成错误时。我们现在可以自由地完成下划线的计划恢复,以指示未使用的lambda,方法或catch形式参数。
tez616oj3#
Java SE 9的Java语言更改https:docs.oracle.com/javase/9/language/toc.htm#JSLAN-GUID-16A5183A-DC0D-4A96-B9D8-AAC9671222DD
从Java 9开始,字符不能再作为标识符使用,不仅仅是在lambda上下文中
下划线字符不是法律的的名称。
如果使用下划线字符(“”)作为标识符,则无法再编译源代码。
omhiaaxx4#
tl;dr
随着Java的发展,下划线字符有了新的特殊含义。
Underscore获得新含义,省略类型和名称
作为Java 21中的预览功能,我们可以看到下划线字符用于:
参见JEP 443: Unnamed Patterns and Variables (Preview)。
Java 9+不允许下划线作为标识符
下划线字符(
_
)是十进制代码点95,十六进制5 F。在Unicode标准中正式命名为LOW LINE
。使用下划线作为标识符会引发:
参见:JEP 213: Milling Project Coin。