函数文本的短格式
Scala提供了许多方法去除冗余信息并把函数文本写得更简短。注意留意这些机会,因为它们能让你去掉代码里乱七八糟的东西。
51CTO编辑推荐:Scala编程语言专题
一种让函数文本更简短的方式是去除参数类型。因此,前面带过滤器的例子可以写成这样:
Scala编译器知道x一定是整数,因为它看到你立刻使用了这个函数过滤整数列表(由someNumbers暗示)。这被称为目标类型化:target typing,因为表达式的目标使用——本例中someNumbers.filter()的参数——影响了表达式的类型化——本例中决定了x参数的类型。目标类型化的精确细节并不重要。你可以简单地从编写一个不带参数类型的函数文本开始,并且,如果编译器不能识别,再加上类型。几次之后你就对什么情况编译器能或不能解开谜题有感觉了。
- scala> someNumbers.filter((x) => x > 0)
- res7: List[Int] = List(5, 10)
第二种去除无用字符的方式是省略类型是被推断的参数之外的括号。前面例子里,x两边的括号不是必须的:
占位符语法
- scala> someNumbers.filter(x => x > 0)
- res8: List[Int] = List(5, 10)
如果想让函数文本更简洁,可以把下划线当做一个或更多参数的占位符,只要每个参数在函数文本内仅出现一次。比如,_ > 0对于检查值是否大于零的函数来说就是非常短的标注:
你可以把下划线看作表达式里需要被“填入”的“空白”。这个空白在每次函数被调用的时候用函数的参数填入。例如,由于someNumbers在第113页被初始化为值List(-11, -10, -5, 0, 5, 10),filter方法会把_ > 0里的空格首先用-11替换,就如-11 > 0,然后用-10替换,如-10 > 0,然后用-5,如-5 > 0,这样直到List的***一个值。因此,函数文本_ > 0与稍微冗长一点儿的x => x > 0相同,演示如下:
- scala> someNumbers.filter(_ > 0)
- res9: List[Int] = List(5, 10)
有时你把下划线当作参数的占位符时,编译器有可能没有足够的信息推断缺失的参数类型。例如,假设你只是写_ + _:
- scala> someNumbers.filter(x => x > 0)
- res10: List[Int] = List(5, 10)
这种情况下,你可以使用冒号指定类型,如下:
- scala> val f = _ + _
- < console>:4: error: missing parameter type for expanded
- function ((x$1, x$2) => x$1.$plus(x$2))
- val f = _ + _
- ˆ
- scala> val f = (_: Int) + (_: Int)
- f: (Int, Int) => Int = < function>
- scala> f(5, 10)
- res11: Int = 15
请注意_ + _将扩展成带两个参数的函数文本。这也是仅当每个参数在函数文本中最多出现一次的情况下你才能使用这种短格式的原因。多个下划线指代多个参数,而不是单个参数的重复使用。***个下划线代表***个参数,第二个下划线代表第二个,第三个……,如此类推。
【相关阅读】