本期内容:
- Scala 中函数式变成彻底详解
- Spark源码中的Scala函数式编程
- 案例和作业
def fun1(name:String){println(name)}
val fun1_v = fun1 _ //函数名+空格+_ 代表函数原型 可以赋值给变量
fun1_v: String => Unit = <function1>
fun1("Spark")
fun1_v("Spark")
匿名函数
val fun2 = (content: String) => println(content)
fun2("Scala")
高阶函数
函数的参数为函数
函数可赋值给变量,变量作为函数参数
val hiScala = (content : String) => println(content)
def bigData(func: String => Unit, content: String) {func(content)}
bigData(hiScala, "Spark")
val array = Array(1,2,3,4,5,6,7,8,9)
array.map(item => item*2)
高阶函数的返回值也可能是函数
def func_Returned(content: String) = (messege : String) => println(content+" "+messege)
val returned = func_Returned("Spark")
returned("Scala")
// Spark Scala
参数推断
将一个匿名函数传递给另外一个函数或方法是,Scala会尽量帮助你推断出类型信息
对于只有一个参数的函数,你可以省略掉外围的()
如果参数在=>右侧只出现过一次,就可以用下划线(_)代替,甚至可以不加参数,不写
闭包
函数的变量超出其有效域时还能对函数内部的变量进行访问
funcResult 仍可以访问scala的 content变量 “Spark”
生成了一个看不见的对象
柯里化 currying
将原来接受两个参数的函数变成新的接受一个参数的函数的过程。
新的函数返回一个以原有第二个参数作为参数的函数
常用高阶函数
(1 to 100).reduceLeft(_+_)
从左向右累加
.map
.flatMap(_.split)
.zip
作业
统计一个文件夹下面所有文件中的单词出现的总次数