函数式编程
函数式编程,结构化编程,OO编程都是编程的方法论。
函数式编程主要思想是把运算过程尽量写成一系列嵌套的函数调用。
特点如下:
1。函数可以像其他数据类型一样使用
可以可以赋值给其他变量,可以作为参数传入另一个函数或者作为别的函数的返回值
2。只用表达式,不用语句
表达式是 个单纯的运算过程,总是有返回值。语句是执行某种操作,没有返回值。
3。不修改状态
只返回新值,不修改系统变量。函数的运行不依赖于外部变量或状态,只依赖输入的参数。
好处:
开发速度快,代码简洁,接近自然语言,易于理解
易于并发式编程,不考虑死锁,可以进行代码的热升级。(内部实现与外部无关)
不需要重启,不需要停机。Erlang实现了这点。
def add(x:Int,y:Int)=(x+y)
var result =add _
将一个函数赋值给一个变量时必须在函数的后面加上一个空格和一个下画线。
闭包,闭包的实质就是代码与用到的非局部变量的混合。
闭包=代码+用到的非局部变量
var y=1
val sum=(x:Int)=>x+y
sum引用到了外部变量y,外部变量y的变化函数也会捕获到。(怎么做到?添加引用?)
控制抽象
在scala中,可以将一系列语句归组成不带参数也没有返回值的函数。
def runInThread(block:() => Unit)
{
new Thread {
override def run() {block() }}.start()
}
这里 block是一个函数的占位符,这个函数没有参数也没有返回值。
scala 可以构建控制抽象,看上去像编程语言的关键字的函数。
def util(condition:=>Boolean)(block:=>Unit){
if(!condition)
{ block
util(condition)(block)
}
}
val m=Map(“key1”->”values”)
val v=m.get(“key1”).get
val v =m.get(“key2”).getorElse(“None”)
flatMap是map和flatten操作的结合,先进行map操作,然后再进行flatten操作。
val l=List(List(1,2,),List(3,4,5))
l.flatMap(x=>x+1)
隐式转换是scala的精髓之一。
在使用第三方函数库的时候,你不能方便地改变源码,对于这个时候遇到的不便,scala中解决这个问题是使用隐式类型变换和隐式参数,它们可以使调用函数库变得更加方便,并避免一些烦琐和显而易见的细节。
scala中的implicit可以用于类,方法和参数。
1。自动进行某些数据类型的隐式转换
implicit def strToInt(str:String)=str.toInt
val x:Int = “100”
_ 在scala中是一个占位符
如果类的主构造器函数的参数中没有用val或var来声明变量,则这时的变量是private级别的,只能在类内部访问。
rdd.collect()
以数组的形式返回这个RDD中所有的数据,
确定这个RDD中的数据是少量的,否则会造成driver的内存溢出。