您的位置:首页 > 编程语言

scala函数式编程

2016-01-20 00:21 204 查看
1.作为值的函数

在Scala中,函数和数字一样,可以在变量中存放函数。可以把函数赋值给一个变量,格式为:val foee=fun _(函数名+空格+_)形式

2.匿名函数

在scala中,不需要给每一个函数命名,而是将该匿名函数赋值给一个变量

例如:Array(3,4,5).map((x:Double)=>3*x)

//Array(9,12,15)

在这里,我们告诉map方法,将每个元素乘以3

匿名函数一般格式:(参数1,参数2,...)=>{函数体(代码块)}

3.带函数参数的函数

实现接受另一个函数作为参数的函数

例如:def value(f: (Double)=>Double)=f(0.25)//这里的参数是任何接受Double并返回Double的函数

然后调用:value(sqrt_)//0.5

spark源码中主要是对集合的处理。由于value是一个接受函数参数的函数,因此它被称为高阶函数。

高阶函数也可以产出另一个函数,例如:

def mulBy(factor: Double)=(x: Double)=>factor*x

val quintuple=mulBy(5)

quintple(20)//100

4.函数返回值也是函数

def func(s:String)=(m:String)=>println(s+":"+m)

func("spark")返回的是一个函数,在函数体中,对于输入参数,只使用一个,则输入参数名可以省略,用_(占位符)替代

例如:val array=Array(1,2,3,4)

array.map(2*_).foreach(println)//2,4,6,8

5.闭包,操作作用域,闭包由代码和代码用到的任何非局限变量定义构成

def mulBy(factor: Double)=(x: Double)=>factor* x

考虑如下调用:

val a=mulBy(3)

val b=mulBy(0.5)

println(a(14)+" "+b(14))//42 7

函数在执行完后,再次执行该函数,函数内部参数仍能被访问

6.柯里化:n个参数的函数,被转换成n个函数

例如:def sum(x:Int,y:Int)=x+y

def sum(x:Int)(y:Int)=x+y

7.SVM转换

在scala中,每当需要告诉另一个函数做某事时,就会传一个函数参数给它。Java并不支持函数,java程序员需要付出更多才能达到相同的效果。其通常做法是将动作放在一个实现某接口的类中,然后将该类的一个实例传递给另一个方法。

为了启用这个语法,需要提供隐式转换。

8.集合式函数编程

主要是对List,Set集合的函数操作
val list=List("Scala","Spark","Hadoop")
list.map(_)
list.map(println)
mutable(可变),immutable(不可变)
scala.collection.Map :不可变
scala.collection.mutable.Map:可变

实际的一个函数编程例子:

统计一个文件夹下面所有文件中所有单词出现的总次数。
以空格作为单词的分隔符,test文件夹下有两个文本文件1.txt,2.txt

import java.io.File
import scala.io.Source
object SecondJob {
def main(args: Array[String]): Unit = {
val dirfile=new File("G:/data/test")
val files=dirfile.listFiles
for(file <-files) println(file)
val listFiles=files.toList
val wordsMap=scala.collection.mutable.Map[String,Int]()
listFiles.foreach( file =>Source.fromFile(file).getLines().foreach(line=>line.split(" ").
foreach(
word=>{
if (wordsMap.contains(word)) {
wordsMap(word)+=1
}else {
wordsMap+=(word->1)
}
}
)
)

)
println(wordsMap)
for((key,value)<-wordsMap) println(key+": "+value)
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: