【发布时间】:2015-12-30 01:30:58
【问题描述】:
我尝试将 lambda 参数命名为 _,例如(精简版):
Consumer<Object> c = _ -> {};
因为我想表明一个参数被忽略,但我得到了以下编译器错误:
lambda 参数禁止使用“_”作为标识符
这对我来说是一个惊喜。有趣的是,两个下划线是可以的:
Consumer<Object> c = __ -> {}; // no compile error
所以一般来说它不是下划线字符,而是一个。
为什么特别禁止使用单下划线名称?
【问题讨论】:
-
请记住:仅仅因为两个下划线不被禁止,这并不是一个好主意。我们的目标不是智取编译器,而是编写代码,让那些阅读你的代码的穷人永远不必花一秒钟的时间去思考“这段代码做了什么”。
-
@BrianGoetz 我认为这个想法很好。导致我发现这一点(和真正的惊喜)的用例是编写一个不使用其参数的消费者(传递给现有的 API)。我通常使用单个字母作为 lambda 参数名称,所以我想我会遵循 spock 的引导(使用下划线作为通配符)来传达“忽略”。我最终只是使用“忽略”作为名称。尝试双下划线并不是试图规避;这是一个测试,以确认只有一个下划线是非法的(而不是一般的下划线字符)。新年快乐:)
-
@holger 这不是骗子。另一个问题不是问为什么,而是问这个。
-
@Bohemian:但 answer 解释了原因。这正是“这个问题在这里有答案”的意思。并不是说问题是相同的。甚至还有一个指向 Brian Goetz 帖子的链接(但在评论中)……
-
@ncmathsadist 使用下划线的一个很好的理由是groovy 被广泛使用,它使用下划线作为“任何东西”的占位符(绰号 wunderbar) 在其闭包(即 lambdas)中,因此是一个先例。
标签: java lambda java-8 underscores