介绍
闭包的必要条件:
- 外部函数必须 返回 一个 函数对象
- 返回的函数对象内,必须引用 外部函数 的 形参 或 局部变量
返回的函数就称为: 闭包
注意:
- 不是全局变量
- 返回的函数对象内,不一定要return
作用
- 可以封装函数局部变量
例子
def main(args: Array[String]): Unit = {
def add(i:Int,j:Int):() => Int ={
def fun():Int= {
return i + j
}
/*
注意返回的是fun,后面没有小括号
有小括号表示调用函数
*/
return fun
}
}
说明:
在函数 add() 内定义了 内部函数fun() ,在 fun() 函数中 引用了外部函数 add() 的 形参 或者 局部变量 ,并将 fun返回
注意:
返回的是 fun,后面 不能有小括号 ,有小括号 表示 调用函数
调用
//调用add()时,返回的并不是求和结果,而是求和函数
val addFun=add(1,1)
//打印函数的内存地址
println(addFun)
//后面加小括号表示调用
println(addFun())
另一种调用方式:
println(add(1,1)())
println(add(2,2)())
可以保存局部变量
见下面的代码,在函数内部对变量进行修改
def main(args: Array[String]): Unit = {
var i:Int=0
def sum(a:Int):Int = {
i += a
i
}
sum(1)
println(i)
sum(2)
println(i)
sum(3)
println(i)
}
上面的代码使用了变量,可以通过闭包方式隐藏掉
改造成闭包
def main(args: Array[String]): Unit = {
def sum():(Int) => Int = {
var i = 0
def fun(a:Int): Int = {
i += a
i
}
fun
}
val sumFun:(Int) => Int =sum()
println(sumFun(1))
println(sumFun(2))
println(sumFun(3))
}
总结:
sum() 函数的局部变量 i,可以保存住数据
内部用lambda表达式
def main(args: Array[String]): Unit = {
def sum():(Int) => Int = {
var i: Int = 0
a => {
i+=a
i
}
}
val sumFun = sum()
println(sumFun(1))
println(sumFun(2))
println(sumFun(3))
}