Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏

Spark源码中的Scala类函数式编程

函数是第一等公民,在Spark源码中函数随处可见。
函数可赋值给变量,同理变量也可赋值给函数。

  1. RDD.scala
     
     
1
     
     
def map[U: classTag](f: T => U): RDD[U] = withScope [...

(f: T => U)中,f代表函数,T代表函数f的参数,U代表函数f的返回值

  1. GraphImpl.scala
     
     
1
2
     
     
override def mapVertices[VD2: ClassTag]
(f: (VertexId, VD) -> VD2)(implicit eq: VD =:= VD2 = null): Graph[VD2, ED]
  1. LinearRegression.scala
    机器学习重要对象,线性回归,里面包括了线性回归的模式算法,函数加数学模型,模型训练等。要看懂这个类,掌握矩阵算法是必须的。

#Scala中函数编程操作实战

动手写一写

  1. 一个例子
     
     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
     
     
object FunctionProgramming {
def main(args: Array[String]): Unit = {
//val hiData = hiBigData //这里不可以直接赋值
val hiData = hiBigData _ //而这样却可以,神奇
hiData("Spark") //正常运行
(name: String) => println("Hi, " + name) //匿名函数,可不要函数名。Spark源码中,此种代码随处可见,例:RDD.scala
val f = (name: String) => println("Hi, " + name) //如想使用匿名函数,可赋值给变量
f("Kafka")
/*
* func函数
* name参数
* 函数可直接做为参数传给方法,极大简化了编程语法。
* 而在Java中通过Callback方式实现此类功能。
* 便于编写业务逻辑和控制逻辑
*/
def getName(func: (String) => Unit, name: String) {
func(name)
}
getNmae(f, "Scala")
/*
*
*
*/
}
def hiBigData(name: String) {
println("Hi, " + name)
}
}
  1. 高阶函数
    函数作为函数的参数。此编程方式称为高阶函数编程。
    Spark源码随处可见,占比60%以上。
     
     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
     
     
val multipleElement = Array(1 to 10: _*).map { (item: Int) => 2 * item }.foreach { x => println(x) }
//函数也可作为方法的返回值
//但此种写法与上面的val f = (name: String)...有什么 区别呢
def funcResult = (name: String) => println("Hi, " + name)
funcResult("Java")
def functResult(message: String) = (name: String) => println(message + “ : ” +name)
funcResult("Java") //这样写不会打印内容
/*
* Curring写法
* 链式写法
*/
funcResult("Hello")("Java") //这样才是正确的写法,即:方法调用,返回值也是函数直接调用,而这个返回值为函数的东西,只对funcResult方法有效。
/*
* 所以上面的代码可拆解为下面的写法。
* 该写法即为Scala闭包。与Javascript原理相近
*/
val result = funcResult("Hello")
result("java") //上面的代码等同于上面的那一行代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值