如果想让函数字面量更简洁,可以把下划线(_)当做一个参数的占位符(或者更多个参数的占位符,更多个的例子,我们在下一节中会讲到),每个参数在函数字面量内会出现一次且仅会出现一次(解释:基本上函数字面量内出现几个下划线,编译后这个匿名函数就会产生几个参数,所以说都会出现一次且仅会出现一次)。如例:
object LongLines {
def main(args:Array[String]){
val someNumbers = Array(-11,-10,-5,0,5,10)
println(someNumbers.filter(_ > 0).length)
}
}
结果:
你可以把下划线(_)看作表达式里需要被“填入”的“空白”。这个空白在每次函数被调用的时候用函数的参数填入。
有时候你把下划线(_)当作参数的占位符,编译器可能无法推断缺失的参数类型。例如:
这种情况下,你可以使用冒号指定类型(注意:指定类型的时候,一定要加小括号),如下:
上面是没有加小括号报错的例子。正确的定义如下::
其实,val f = (_:Int) + (_:Int) 这个表达式是:val f = (a:Int,b:Int) => a+b的简化版本。
解释:_ + _ 将扩展成带两个参数的函数字面量。注意:仅当每个参数在函数字面量中最多出现一次时(必须一次且仅有一次),你才能使用这种格式。多个下划线指代多个参数,而不是单个参数的重复使用。第一个下划线代表第一个参数,第二个下划线代表第二个参数,第三个....,如此类推。
注意:一个下划线(_)代表一个参数的情况,基本是出现在匿名函数字面量作为某一函数的参数时。