Scala之旅-嵌套方法(NESTED METHODS)和多参数列表(Currying)

嵌套方法(NESTED METHODS)

Scala 中可以定义嵌套方法。以下提供了 factorial 方法用于计算给定数字的阶乘。

 def factorial(x: Int): Int = {
    def fact(x: Int, accumulator: Int): Int = {
      if (x <= 1) accumulator
      else fact(x - 1, x * accumulator)
    }  
    fact(x, 1)
 }
 println("Factorial of 2: " + factorial(2))
 println("Factorial of 3: " + factorial(3))

这里写图片描述
程序的输出如上图所示。

多参数列表(Currying)

方法可以定义多个参数列表。当用少量的参数列表调用方法时,这将会产生一个函数,将缺少的参数列表作为参数。这被正式的称为 currying
下面的方法定义在 Scala 集合的 Traversable trait 中:

def  foldLeft[B](z: B)(op: (B, A) => B): B

按照从左到右的顺序,foldLeft 将二进制运算符op 应用于初始化 ztraversable 的所有元素。下面的例子展示它的用法。
以一个初始值 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

这里写图片描述
多参数列表具有冗长的调用语法,因此建议谨慎使用。建议使用的情况包括:

单个函数参数

单个函数参数的情况下(如上面 foldLeft 中的 op);多参数列表函数允许使用简洁的语法将匿名函数传递给方法。没有多参数列表的情况,代码将会像下面这样:

numbers.foldLeft(0, {(m: Int, n: Int) => m + n}) 

注意此处还可以利用 Scala 类型推断的优点来使多个参数列表的函数变得更简洁。如下所示,这种写法在非 curring 定义下是不可能的。

numbers.foldLeft(0)(_ + _)

这里写图片描述
此外,它允许我们固定(fix)参数并可以传递部分函数和重新使用它

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,则应该使用多个参数列表。如下所示:

def execute(arg: Int)(implicit ec: ExecutionContext) = ???
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值