概念
-
函数运行的环境
-
持有函数运行状态
-
函数内部可以定义函数
-
函数内部可以定义类
代码示例
package com.yzdzy.kotlin.chapter5.closure
val string= "HelloWorld"
fun makeFun():()->Unit{
var count = 0
return fun(){
println(++count)
}
}
fun main(args: Array<String>) {
val x= makeFun()
x()
x()
x()
x()
x()
x()
x()
x()
x()
}
输出
1
2
3
4
5
6
7
8
9
函数的作用域没有被释放。作用域包含了什么呢、函数运行的状态。变量。本地类,本地函数等扥个
这个函数域其实就是闭包
我们可以写一个斐波那契数列
package com.yzdzy.kotlin.chapter5.closure
val string= "HelloWorld"
fun makeFun():()->Unit{
var count = 0
return fun(){
println(++count)
}
}
//斐波那契数列 这个数列从第3项开始,每一项都等于前两项之和。
fun fibonaqi(): ()-> Long{
var first = 0L
var second = 1L
return fun():Long{
val result = second 1
second+=first
first=second-first
return result
}
}
fun main(args: Array<String>) {
val x= fibonaqi()
println(x())
println(x())
println(x())
println(x())
println(x())
println(x())
println(x())
}
如果求100以内的斐波那契数列呢?
package com.yzdzy.kotlin.chapter5.closure
//斐波那契数列 这个数列从第3项开始,每一项都等于前两项之和。
fun fibonaqi(): Iterable<Long> {
var first = 0L
var second = 1L
return Iterable {
object : LongIterator() {
override fun hasNext() = true
override fun nextLong(): Long {
val result = second
second += first
first = second - first
return result
}
}
}
}
fun main(args: Array<String>) {
for (i in fibonaqi()) {
if(i>100)break
println(i)
}
}
1
1
2
3
5
8
13
21
34
55
89
闭包可以写的更复杂或者是简单
package com.yzdzy.kotlin.chapter5.closure
fun add(x: Int) = fun(y: Int) = x + y
fun addSimple(x:Int):(Int)->Int{
return fun(y:Int):Int{
return x+y
}
}
fun main(args: Array<String>) {
val add5 = add(5)
println(add5(2))
val addSimple5 = addSimple(5)
println(addSimple5(2))
}