Scala高阶函数说明和使用
函数在Scala中是“头等公民”,它的使用方法和任何其他变量是一样的。所谓高阶函数(Higher-Order Function)就是操作其他函数的函数。Scala 中允许使用高阶函数, 高阶函数可以使用其他函数作为参数,或者使用函数作为输出结果。
函数作为值被传递和赋值
Scala中可以将函数赋值给var、val、def定义的变量,代码实例如下:
object HigherOrderFunctionOps1 {
def main(args: Array[String]): Unit = {
sayHello("Old One")
val sayTwo=sayHello _
sayTwo("Old Two")
var sayThree=sayHello _
sayThree("Old Three")
def sayFour=sayHello _
sayFour("Old Four")
}
def sayHello(name: String): Unit ={
println(s"${name} say Hello to you!")
}
这里有个约定:将函数赋值给变量时,必须在函数后加上空格和下划线。
匿名函数
匿名函数顾名思义是没有函数名的函数,这种函数在使用的使用必须将函数赋值给其他变量或者函数。语法形式是:
(函数参数) => {代码块} 或 返回值类型
代码实例如下:
object HigherOrderFunctionOps2 {
def main(args: Array[String]): Unit = {
var printMag=(name:String) => println(s"${name}搞偷袭,不讲武德!")
printMag("年轻人")
var niceSub=()=> println("好感减1!")
niceSub()
var numSub=(num:Int) => num-1
println(s"当前好感度:${numSub(5)}")
}
}
高阶函数定义和参数类型推断
有了匿名函数和函数作为值传递的语法基础,就可以定义高阶函数了。下面是函数作为函数参数的使用实例:
object HigherOrderFunctionOps3 {
def main(args: Array[String]): Unit = {
funOps
}
def funOps: Unit ={
def sayBye(name:String,fun:(String)=>Unit): Unit ={
fun(name)
}
sayBye("张三",(name:String)=>method(name))//调用有名函数
sayBye("李四",(name:String)=>{
println(s"${name}真是个人才!")//调用匿名函数
})
}
def method(str:String): Unit ={
println(s"${str}是名字!")
}
}
Scala提供了一个使用通配符_ 下划线替代参数的用法,或直接使用函数名的方法:
sayBye("王五", println(_))//类型推断
sayBye("赵四", println)//类型推断