Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么单个下划线字符是lambda参数的非法名称?_Java_Lambda_Java 8_Underscores - Fatal编程技术网

Java 为什么单个下划线字符是lambda参数的非法名称?

Java 为什么单个下划线字符是lambda参数的非法名称?,java,lambda,java-8,underscores,Java,Lambda,Java 8,Underscores,我试着命名一个lambda参数。,例如(精简版本): consumerc=.->{}; 因为我想表示一个参数被忽略,但我得到了以下编译器错误: 对于lambda参数,禁止使用“\u1”作为标识符 这对我来说是个惊喜。有趣的是,有两个下划线是可以的: Consumer<Object> c = __ -> {}; // no compile error consumerc=\uu->{};//没有编译错误 所以它不是一般的下划线字符,而是一个单独的字符 为什么要特别禁止使用单

我试着命名一个lambda参数
,例如(精简版本):

consumerc=.->{};
因为我想表示一个参数被忽略,但我得到了以下编译器错误:

对于lambda参数,禁止使用“\u1”作为标识符

这对我来说是个惊喜。有趣的是,有两个下划线是可以的:

Consumer<Object> c = __ -> {}; // no compile error
consumerc=\uu->{};//没有编译错误
所以它不是一般的下划线字符,而是一个单独的字符


为什么要特别禁止使用单下划线名称?

原因可以从以下几方面表达:

我们正在从标识符的空间中“回收”“u”的语法属性,以便在未来的语言特性中使用。但是,由于存在可能使用它的现有程序,因此它对于8的现有语法位置中出现的标识符是一个警告,对于lambda formals是一个错误(因为lambda没有现有代码)


请记住:仅仅因为两个下划线是不被禁止的,并不意味着这是一个好主意。我们的目标不是智胜编译器,而是编写代码,让那些读过你的代码的穷人永远不会花一秒钟去思考“这段代码做什么。”@BrianGoetz我认为这个想法很好。导致我发现这一点(也是真正令人惊讶的)的用例是编码一个没有使用其参数(传递给现有API)的消费者。我通常使用单个字母作为lambda参数名,所以我想我应该遵循斯波克的思路(使用下划线作为通配符)来传达“忽略”。我最后只用了“忽略”这个名字。尝试使用双下划线并不是企图规避;这是一个测试,以确认只有一个下划线是非法的(而不是一般的下划线字符)。新年快乐:)@holger这不是骗局。另一个问题不是问为什么,而是问。@Bohemian:但答案解释了原因。这正是“这个问题在这里有答案”的意思。问题并不完全相同。甚至有一个链接指向Brian Goetz的帖子(但在评论中)…@ncmathsadist使用下划线的一个很好的理由是[groovy](,它被广泛使用,在闭包(即lambdas)中使用下划线作为“任何东西”的占位符)这是一个先例。这发生在另一种新的学术资助编程语言(Scala)将下划线用于特殊目的后不久。@Joop groovy与Scala一样,也将下划线用于“任意数量/类型的参数”
Consumer<Object> c = __ -> {}; // no compile error