方法可以定义多重参数列表。当一个方法被调用时仅传入一部分参数时将会产生一个由剩下参数列表作为参数的方法。我们通常叫它——柯里化。
这里有一个例子,在 Scala 的集合库中定义的一个可遍历化特征(Traversable trait)中的一个方法:
def foldLeft[B](z: B)(op: (B, A) => B): B
foldLeft
方法使用一个二元操作符(匿名函数) op
去操作传入的初始化值 z
和实现了这个的特征的集合中的所有元素,将每一个元素中的值与 z
进行操作,然后将结果放入 z
中,所有元素的遍历方向为从左到右。下面的例子说明了它的用法。
使用初始值 0 开始,foldLeft
方法使用匿名函数 (m, n) => m + n
去操作遍历在集合列表中的每一个元素,将它累加在之前的初始值中并返回。
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val res = numbers.foldLeft(0)((m, n) => m + n)
print(res) // 55
多重列表列表有一个更加详细的调用语法,所以它应该被谨慎地使用。建议的使用场景包括:
单个函数参数(SINGLE FUNCTIONAL PARAMETER)
在单个函数作为参数的情况中,比如,像上面例子中的 foldLeft
方法中的 op
参数。多重参数列表在需要一个匿名函数作为参数时允许一种更简洁的语法。在没有使用多重参数列表时,代码可以像下面这样:
numbers.foldLeft(0, {(m: Int, n: Int) => m + n})
使用多重参数列表也允许我们利用 Scala 中的类型推断使代码像下面那样更加简洁,不能用在非柯里化的方法中。
numbers.foldLeft(0)(_ + _)
而且,它还允许我们首先只传入一个参数 z
然后返回一个由剩下的参数作为参数的函数,就像下面:
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val numberFunc = numbers.foldLeft(List[Int]())_
val squares = numberFunc((xs, x) => xs:+ x*x)
print(squares.toString()) // List(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
val cubes = numberFunc((xs, x) => xs:+ x*x*x)
print(cubes.toString()) // List(1, 8, 27, 64, 125, 216, 343, 512, 729, 1000)
隐含参数(IMPLICIT PARAMETERS)
在多重参数列表中指定某些参数为 implicit
,多重参数列表就可以像下面一样被使用 [5]:
def execute(arg: Int)(implicit ec: ExecutionContext) = ???