【30】kotlin 閉包

概念

  • 函數運行的環境

  • 持有函數運行狀態

  • 函數內部可以定義函數

  • 函數內部可以定義類

代碼示例

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))

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章