scala outline
高阶函数高在哪里?
(1)函数可以作为值进行传递
(2)函数可以作为参数进行传递
(3)函数可以作为函数返回值返回
函数可以作为值进行传递
- 在被调用函数f后面
加上空格和下划线
,相当于把函数f当成一个整体
,传递给变量tmp - tmp是一个变量,变量的类型为函数,这个函数的参数为空,返回值为Int
def main(args: Array[String]): Unit = {
def f(): Int = {
println("hello")
77
}
var tmp: () => Int = f _ // tmp:变量名称 () => Int:变量类型
println(tmp())
}
注意:
如果明确了变量的类型,那么空格和下划线可以省略
// 尚未明确变量的类型
var tmp = f _
// 明确了变量的类型,那么函数后的空格和下划线可以省略
var tmp:()=>Int = f
函数可以作为参数进行传递
这个大多数情况都是通过匿名函数的形式 scala匿名函数链接
函数可以作为函数返回值返回
-
以下代码也称之为
函数嵌套
-
语法:函数名称+空格+下划线
def main(args: Array[String]): Unit = {
def f1(): () => Unit = {
def f2(): Unit = {
println("f2函数被调用了")
}
// 将 f2 作为返回值返回给f1,因为f2是函数,所以f1函数的返回值类型也是函数,即() => Unit,该函是参数为空,返回值类型为unit
f2 _ // 语法:函数名称+空格+下划线
}
val f3: () => Unit = f1()
// 因为f1函数的返回值依然为函数,所以可以变量f3可以作为函数继续调用
f3()
// 上面的代码可以简化为
f1()()
}
f2替换为匿名函数
def main(args: Array[String]): Unit = {
def f1(): () => Unit = {
// 1. 函数最后一行默认为返回值
// 2. f2替换为匿名函数(如果可以简化,那就简化,这里不再简化)
()=>{println("f2函数被调用了")}
}
f1()()
}