Kotlin开发指南简书人物Kotlin专题

38. 闭包

2017-11-28  本文已影响31人  厚土火焱

闭包就是函数的运行环境是一个封闭的环境。在环境中有自由变量。也可以理解为函数中的函数。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)
    }
上一篇下一篇

猜你喜欢

热点阅读