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

}

 

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