一步一步理解Scala高阶函数:
第一步:
Scala函数可以作为值,传递给另外一个变量,或者另外一个函数
语法特征: 必须要在函数后面加上空格和下划线
object FunctionOps1 { def main(args: Array[String]): Unit = { //作为值得函数
val sayBye = sayGoodBye _ //函数传递给变量空格和下划线
def say = sayGoodBye _ //函数传递给函数空格和下划线
sayGoodBye("zhangsan") sayBye("KPWong") say("laoli") } /** * 函数可以作为值,传递给另外一个变量,或者另外一个函数 * 语法特征: 必须要在函数后面加上空格和下划线 */ def sayGoodBye(name:String) : Unit = { println("Good bye to " + name) } }
第二步:匿名函数:
匿名函数:就是没有名字的函数
Scala 中定义一个完整函数:
def functionName(Params):returnType = {body}
Scala中定义匿名函数:
(Params) => returnType //匿名函数定义
(Params) => {body} //匿名函数实现
问题:
该匿名函数如何被调用
解决方案:
将匿名函数赋值给一个变量或者函数
val sayAnonymousVal = (name:String) => { println("Good bye to " + name) } //匿名函数赋值给变量
def sayAnonymousFun = (name:String) => { println("Good bye to " + name) } //匿名函数赋值给函数
object FunctionOps1 { def main(args: Array[String]): Unit = { //作为值得函数
val sayBye = sayGoodBye _ //函数传递给变量
def say = sayGoodBye _ //函数传递给函数
sayGoodBye("zhangsan") sayBye("KPWong") say("laoli") sayAnonymousVal("laozhao") sayAnonymousFun("lao Fang") } /** * 函数可以作为值,传递给另外一个变量,或者另外一个函数 * 语法特征: 必须要在函数后面加上空格或者下划线 */ def sayGoodBye(name:String) : Unit = { println("Good bye to " + name) } //匿名函数:就是没有名字的函数
/** * Scala 中定义一个完整函数: * def functionName(Params):returnType = {body} * Scala中定义匿名函数: * (Params) => returnType //匿名函数定义 * (Params) => {body} //匿名函数实现 * 问题: * 该匿名函数如何被调用 * 解决方案: * 将匿名函数赋值给一个变量或者函数 */ val sayAnonymousVal = (name:String) => { println("Good bye to " + name) } //匿名函数赋值给变量 def sayAnonymousFun = (name:String) => { println("Good bye to " + name) } //匿名函数赋值给函数 // def sayGoodBye(name:String) : Unit = { // println("Good bye to " + name) // }
}
第三步: 高阶函数:带函数参数的函数,一个函数的参数是函数,这种函数称为高阶函数
def HigheLevelFunction(name:String,func:(String) => Unit) :Unit = {
func(name)
}
使用高阶函数:
HigheLevelFunction("LaoGao1",sayAnonymousVal)
HigheLevelFunction("LaoGao2",(name:String) =>sayAnonymousVal(name))
HigheLevelFunction("LaoGao3",(name:String) =>sayGoodBye(name))
HigheLevelFunction("LaoGaoAnonymous1",(name:String) =>{println(name)}) //更多情况下使用这一的匿名函数
//如果只有一个参数,可以省略掉()
HigheLevelFunction("LaoGaoAnonymous2",name=>println(name)) //更多情况下使用这一的匿名函数
//可以用通配符"_" 代替一个变量
HigheLevelFunction("LaoGaoAnonymous3",{println(_)})
//最简单的写法,通配符都可以省略
HigheLevelFunction("LaoGaoAnonymous4",println)