全部版块 我的主页
论坛 数据科学与人工智能 大数据分析 spark高速集群计算平台
2159 2
2016-03-23

  函数式编程是scala的最大魅力之所在,在函数式编程语言中,函数是“头等公民”,可以像任何其他数据类型一样被传递和操作。因为Scala混合了面向对象和函数式的特性,所以对Scala来说,函数是“头等公民”。函数可以不依赖于类、对象或者接口而单独存在,函数可以作为函数的参数或作为函数的返回值。使用函数式编程可以简化复杂算法,并且代码量更少。Spark中的所有计算基本上都是用函数式编程来做的。


一、作为值的函数

O(4O9QGU`PDUU09V)~U[D`1.png

fun的类型是(Double)=>Double,意为接受Double参数并返回Double的函数。能够对fun做的有:调用,传递。fun调用:

8DJ}SU4P5DTNK[]IY0X$@JV.png


scala>def fun1(name:String){println(name)}

fun1:(name: String)Unit


scala>val fun1_v = fun1 _

fun1_v:String => Unit = <function1>


scala>fun1_v("hello func")

hellofunc


可以将函数赋值给变量


二、匿名函数

为了算法的简洁性我们可能不需要函数的名称,只需要函数体对我们输入的数据进行处理,这个时候就不需要为函数命名。

%DSWCAZ97U]A(HMR`ZP]]%9.png


fun2是一个变量,函数的参数是String类型,返回类型时Unit。fun2中的=>符号可以看做是创建函数实例的语法糖。例如:A => TA,B => T表示一个函数的输入参数类型是“A”,“A,B”,返回值类型是T。上述定义的匿名函数,其实是下面这种写法的简写:

JXT2NBZRYA[)7A(W5ML0]NR.png

备注:任何函数值都是某个扩展了scala包的若干个FunctionN特质之一的类的实例,如Function0是没有参数的函数,Function1是有一个参数的函数等等。每个FunctionN特质有一个apply方法来调用函数。

复制代码



三、带函数参数的函数(高阶函数)

_T$AJSWK3OK)BGX}KM]O2.png

Rdd中的map方法:

复制代码


函数的函数的返回值是一个函数:

Q)G@PH90HL[8WFK[Z~{C3(4.png


9RO9}W`IOBNYVR86CZE4ENW.png


Scala集合库提供的高阶函数map、zip、flatMap:

9`%YR`QATWVNZ2[Z@~4AAFF.png



YR9F]P{~XO5V~@K~JS926]D.png



LVCLM_Z`({E_E2OGC9F6D88.png



SWT2AHPW3Z50S[D[]6RQ}(3.png


高阶函数的变换:

scala> def spark(func: (String) =>Unit, name: String) = func(name)

spark: (func: String => Unit, name:String)Unit


scala> spark((name:String) =>println(name) , "spark")

spark


scala> spark( name => println(name) ,"spark")  //scala类型推断去掉参数类型

spark


scala> spark(println(_),"spark")  //只有一个参数,用下划线代替

spark


scala> spark(println _,"spark") //部分应用函数,可以使用单个下划线替换整个参数列表

spark


scala> spark(println, "spark")   //只有一个参数,可以省略

Spark


scala> (1 to 3) map( _ * 2)

res8:scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6)


四、闭包

HWR{5$AGGGS2NZSRIMSQM99.png

这里addMore 函数捕获了外部变量more。

五、柯里化(Currying

1)柯里化指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数作为参数的函数。

NDI{16DTN{D22KQ%1@IU9]K.png

scala> def sum_Currying(x: Int) = (y:Int) => x + y

sum_Currying: (x: Int)Int => Int


scala> sum_Currying(45)(4)

res15: Int = 49


通过柯里化变成了两个函数的连续调用,可以看做链式的过程。


2)可以利用柯里化把某个函数参数单独拎出来,提供更多用于类型推断的信息。

]CQ$Y3(_DLU[$_N%P[__OPI.png



注:本学习笔记来自DT大数据梦工厂

附件列表
A345~@J`}8D2SCMH4W1SCXY.png

原图尺寸 6.11 KB

A345~@J`}8D2SCMH4W1SCXY.png

_CXA(S`Y)H[6SK%5N}]A~33.png

原图尺寸 8.49 KB

_CXA(S`Y)H[6SK%5N}]A~33.png

$5UMBVXE`XNPAA_2%GQHJ)3.png

原图尺寸 4.78 KB

$5UMBVXE`XNPAA_2%GQHJ)3.png

WDZS1LVGF97H_MC8O{B)L}4.png

原图尺寸 6.4 KB

WDZS1LVGF97H_MC8O{B)L}4.png

`[HSLX1D8C}@Y`E04]XJEGV.png

原图尺寸 4.78 KB

`[HSLX1D8C}@Y`E04]XJEGV.png

ZV`@[`336MWGCRNKPA2AD1U.png

原图尺寸 5.85 KB

ZV`@[`336MWGCRNKPA2AD1U.png

)}_`W9%H6)(FVXHP`FEB}ZS.png

原图尺寸 5.2 KB

)}_`W9%H6)(FVXHP`FEB}ZS.png

2_NS6451_H49U`9_AGFKCNX.png

原图尺寸 7.54 KB

2_NS6451_H49U`9_AGFKCNX.png

2I9M)875@W_JKNL9W6ZV5U4.png

原图尺寸 6.02 KB

2I9M)875@W_JKNL9W6ZV5U4.png

K35%3%H$)JFY~~A6WEBY9U9.png

原图尺寸 5.32 KB

K35%3%H$)JFY~~A6WEBY9U9.png

9WZOAE7I}A9}SS[YV$%AO4R.png

原图尺寸 5.4 KB

9WZOAE7I}A9}SS[YV$%AO4R.png

%IPC2WSQR%XB}}S4A(T[IT3.png

原图尺寸 5.16 KB

%IPC2WSQR%XB}}S4A(T[IT3.png

ZO62M0@(}M07{P]20@JJ$_L.png

原图尺寸 2.31 KB

ZO62M0@(}M07{P]20@JJ$_L.png

X3KDC7UPQS5B7_SQFBERE%J.png

原图尺寸 2.92 KB

X3KDC7UPQS5B7_SQFBERE%J.png

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2016-3-25 19:12:12
开个系列?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-3-25 21:08:07
daazx 发表于 2016-3-25 19:12
开个系列?
yes,专攻Spark和机器学习!{:2_26:}
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群