概念
-
函數運行的環境
-
持有函數運行狀態
-
函數內部可以定義函數
-
函數內部可以定義類
代碼示例
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))
}