9512.net
甜梦文库
当前位置:首页 >> 电子/电路 >>

03 3000门徒 第三课 SCALA函数式编程彻底精通及SPARK源码阅读



一、

函数

1.

函数定义 def func1(name:String)={ println(name) }

2.

函数赋值给变量 def func1(name:String)={ println(name) } val f1 = func1 _ f1("spa

rk")

3.

函数的参数是函数 //f1是函数参数 传入 double 返回double def func1(f1:(Double)=>Double)=f1(100.55) def f11(x:Double):Double={ if(x>10.0) 1.0 else 0.0 } println(func1(scala.math.ceil _)) println(func1(f11))

4.

匿名函数定义 def func1(f1:(Double)=>Int,x:Double)=f1(x) //(y:Double)=>y.toInt 是匿名函数 val r = func1((y:Double)=>y.toInt,1.666) println(r)

5.

函数的返回值也可以是函数 def mulby(x:Int)= (y:Int)=>x*y println(mulby(2)(3))

6.

高阶函数的类型推断 def func1(f1:(Double)=>Double,x:Double)=if(f1(x)>100) 1 else 0 //只有一个参数 可以推断X类型 func1((x)=>3*x,2.22) //可以省略x的括号 func1(x=>3*x,2.22) //如果在函数右边只出现一次 参数可以直接用_ func1(3*_,2.22)

二、

闭包

变量不在函数做作用域范围内还可以被调用到 //定义函数 def mulby(factor:Double)=(x:Double)=>factor*x //factor被赋值3 val triple = mulby(3) //调用factor*x 此时factor已经不在当前作用域范围 println(triple(1000)) //factor被赋值0.5 val half = mulby(0.5) //调用factor*x 此时factor已经不在当前作用域范围,仍然能被调用 println(half(1000))

三、

柯里化

原来接收两个参数的函数变成接收一个参数的函数的过程, 新的函数返回一个以原有第 二个参数作为参数的函数 //普通定义 两个参数 def mulBy(x: Int, y: Int) = x * y mulBy(2, 3) //柯里化 def mulBy1(x: Int) = (y: Int) => x * y mulBy1(2)(3) //更简洁的柯里化 def mulBy2(x: Int)(y: Int) = x * y mulBy2(2)(3) //柯里化实例 def f1(x: Int, y: Int)(bigger: (Int, Int) => Boolean) = { if (bigger(x, y)) x else y } def bigger(x: Int, y: Int) = { if (x > y) true else false } val r = f1(3, 4)(bigger(_, _)) println(r) //柯里化实例 val arr1 = Array("a", "b", "c")

val arr2 = Array("A", "B", "C") println(arr1.corresponds(arr2)(_ equalsIgnoreCase _)) //柯里化实例 val arr1 = Array("a", "b", "c") val arr2 = Array("A", "B", "C") def eq(a:String,b:String)={ a.toLowerCase() == b.toLowerCase() } println(arr1.corresponds(arr2)(eq(_,_)))

四、

作业

1.

统计一个文件夹下所有文件的单词出现的频次

def wordCount(dir: String) = { val wordCountMap = scala.collection.mutable.Map[String, Int]() val fileList = ListBuffer[File]() getAllFilesFromDir(dir, fileList) def seqop = (m1:scala.collection.mutable.HashMap[String,Int],word:(String,Int))=>{ m1(word._1) = m1.getOrElse(word._1,0)+word._2 m1 } def combop = (m1:scala.collection.mutable.HashMap[String,Int],m2:scala.collection.mutable.HashMap[String,Int])=>{

for((k,v)<-m1){ m2(k) = m2.getOrElse(k, 0)+v } m2 } val wordcount = fileList.flatMap(file => { val lines = Source.fromFile(file).getLines val words = lines.flatMap(line => line.split(" ")) words }).map((_,1)).aggregate(scala.collection.mutable.HashMap[String,Int]())(seqop, combop) println(wordcount) }



更多相关文章:
...第三课-Scala函数式编程彻底精通及Spark源码阅读
03-3000门徒-第三课-Scala函数式编程彻底精通及Spark源码阅读_计算机软件及应用_IT/计算机_专业资料。一、 函数 1. 函数定义 def func1(name:String)={ println...
更多相关标签:
spark scala    spark scala 版本    spark1.6 scala 版本    spark scala 例子    scala spark 实例    spark 2.1 scala 版本    scala和spark的关系    eclipse scala spark    

All rights reserved Powered by 甜梦文库 9512.net

copyright ©right 2010-2021。
甜梦文库内容来自网络,如有侵犯请联系客服。zhit325@126.com|网站地图