一、Scala函数式编程
1.函数定义及赋值给变量
def fun1(name : String){printf("test")}// 函数定义
fun1 : (name:String) Unit
val fun1_v = fun1 _ //函数赋值给变量
fun1_v :String => Unit =<function1>
2.匿名函数
val fun = (content : String) => println(content)
3.高阶函数
1)def bigData =(func:(String) => Unit,content :String){func(content)}
bigData:(func:String => Unit,content :String)Unit
2)高阶函数的返回值也可能是函数
def func_Returned(content:String) = (message :String) => print(message)
//func_Returned :(content :String)String => Unit
3)注:如果在函数体只使用了一次函数的输入参数的值,此时可以将函数名省略,可以使用'_'代替
高阶函数有类型推断
Array.map(2*_)// 对Array中每个元素乘以2
Array.map(2*_).foreach(print(_)) 或者 Array.map(2*_).foreach(print _) 或者Array.map(2*_).foreach(print)
Array.map(2*_).filter(_ > 10).foreach(println)
4)reduce操作:
(1 to 100).reduceLeft(_+_) //5050
4.闭包
函数的变量超出其作用域时,仍然可以对函数内部的变量进行访问
def scala(content : String) = (message:String) => println(content + " " + message)
val funcResult = scala("Spark")
funcResult("Flink")
结果是:Spark:Flink
5.科里化
将一个拥有两个参数的函数转换成拥有一个参数的两个函数
def sum(x:Int,y:Int)
科里化 def sum_Currying(x:Int) = (y:Int) => x + y
sum_Currying(1)(2)
或者:def sum_Currying_Better(x:Int)(y:Int) = x + y
sum_Currying_Better(1)(2)
6.集合
List
val list = List("Hadoop","Spark")
list.map("the content is :" + _)
// List[String] = list(the content is :Hadoop,the content is Spark)
//flatMap
list.flatMap(_.split( " "))
//zip
list.zip(List(1,2))
// List((Scala,10),(Spark,2))