闭包就是函数的运行环境是一个封闭的环境。在环境中有自由变量。也可以理解为函数中的函数。kotlin 中可以把函数当作参数和返回值来用。
先写一个累加
fun makeFun():()->Unit{
var count = 0
return fun(){
println(++count)
}
}
可以看到,返回值是一个匿名函数。匿名函数实现的是 makeFun() 函数内变量的累加。
val x = makeFun()
x()
x()
x()
x()
这样调用就可以了。
因为闭包是内存中始终保存着变量,所以每次运行都在原有基础上进行操作。不会因为函数运行结束就清除内存变量。
再看一个斐波那契数列的例子。
fun fibonacci():()->Int{
var first = 0
var second = 1
return fun():Int{
var result = second
second += first
first = second - first
return result
}
}
fun fibonacci2():()->Int{
var first = 0
var second = 1
return fun():Int{
var result = first + second
first = second
second = result
return first
}
}
这两个函数没有什么本质的区别。理解了就好。
调用如下
val x = fibonacci2()
println(x())
println(x())
println(x())
println(x())
println(x())
看一个迭代器的例子,还是以斐波那契数列来写。
fun fibonacci3(): Iterable<Int> {
var first = 0
var second = 1
return Iterable {
object : IntIterator() {
override fun nextInt(): Int {
val result = first + second
first = second
second = result
return first
}
override fun hasNext() = true
}
}
}
调用的时候,需要控制取值范围。
for (i in fibonacci3()) {
if (i > 100) break
println(i)
}