频道栏目
首页 > 网络 > 云计算 > 正文

Scala嵌套方法(NESTEDMETHODS)和多参数列表(Currying)解析

2018-05-16 14:01:42      个评论    来源:朝花夕拾  
收藏   我要投稿

嵌套方法(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 应用于初始化 z 和 traversable 的所有元素。下面的例子展示它的用法。
以一个初始值 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) = 
上一篇:Hive通过查询语句向表中插入数据注意事项
下一篇:执行Docker报错WARNING:IPv4forwardingisdisabled.Networkingwillnotwork
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站