kotlin: 闭包
一,定义:
什么是闭包?闭包,即是函数中包含函数,
* 这里的函数我们可以包含(Lambda表达式,匿名函数,局部函数,对象表达式)。
Lambda/匿名函数 可以访问其外部作用域的变量(如函数内的局部变量),
且会「捕获」这些变量(即使外部函数执行完毕,Lambda 仍可使用这些变量)
外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象。
Kotlin 的闭包可以获取上下文的局部变量,并可以修改它。
实现办法是 Kotlin 编译器给引用的局部变量封装了一层引用
二,例子:
代码:
//处理按钮点击事件
binding.button1.setOnClickListener {
//返回类型为 () -> Int 的表达式
fun printCalc(): () -> Int {
var a = 3
val b = 4
//返回一个匿名函数
return {
//修改作用域外的变量
println("a:${a},b:${b}")
a++
//读取作用域外的变量
a + b
}
}
val pFun = printCalc()
println("第1次:"+pFun())
println("第2次:"+pFun.invoke())
println("第3次:"+pFun())
println("第4次:"+pFun.invoke())
}
运行结果:
三,例子:
代码:
//处理按钮点击事件
binding.button2.setOnClickListener {
fun greeting(name:String) {
var age=18
val hello = {
age++
println("hello,${name},你今年${age}岁了")
}
hello()
hello.invoke()
}
greeting("老王")
var sum = 0
val ints = listOf<Int>(2,4,6)
//foreach参数是一个表达式函数,它在访问外部变量
ints.forEach {
sum += it
}
println("sum:${sum}")
}
运行结果:
四,例子:
代码:
//处理按钮点击事件:
binding.button3.setOnClickListener {
//返回类型为 () -> Int 的匿名函数
fun method(b: Int): () -> Int {
var a = 3
return fun(): Int {
println("a:${a},b:${b}")
a++
return a + b
}
}
val test = method(3)
println("第1次调用:"+test()) //7
println("第2次调用:"+test.invoke()) //8
println("第3次调用:"+test()) //9
println("第4次调用:"+test.invoke()) //10
println("第5次调用:"+test()) //11
}
运行结果:
五,例子:
代码:
//处理按钮点击事件
binding.button4.setOnClickListener {
//捕获参数变量的例子
fun createMultiplier(factor: Int): (Int) -> Int {
return { x ->
println("factor:${factor}")
x * factor
} // 返回一个闭包,它捕获了factor变量
}
val multiplier = createMultiplier(5) // multiplier是一个闭包,它捕获了factor=5
println(multiplier(10)) // 输出 50
println(multiplier(20)) // 输出 100
}
运行结果: