Partial Function指的是对输入数据中的某一类型数据起作用的函数。它的声明如下:
traitPartialFunction[-A, +B] extends (A) ⇒ B
是函数的子trait
使用如下,例如:
val toZero : PartialFunction[Int,Int] = {
| case one if (one < 0) => 0
| }
scala> toZero.isDefinedAt(1)
res14: Boolean = false
scala> toZero(-1)
res15: Int = 0
神奇的case:
val actionRank = formatedRDD //生成了(imac,ip,version,data,data) 的tuple,可能有()或者其他
.map {
case (imac, ip, version, date, data) => ((imac, version),Try(data.split("#").last.split(":")(1).toLong).getOrElse(0l))
}
这个例子可以看出,在实际使用中,传给一个函数的可能有多种类型的数据,使用case可以处理你想要处理的那种类型数据,而这正是Partial Function的优势。
使用Scala编写spark程序中,使用case可以让tuple,map等程序中变量更易读。
val dollar = Map("China" -> "CNY", "US" -> "DOL")
//perfer
dollar.foreach {
case (country, currency) => println(s"$country -> $currency")
}
//avoid
dollar.foreach ( x => println(s"$x._1 -> $x._2") )
大量使用_.1,_.2等形式,过几天自己写的数据结构也难以读懂。
另外,partially applied function 指的是:函数参数已经有了默认值。
例如:
def add(i: Int, j: Int) = i + j
val add5 = add(_: Int,5)