kotlin: 闭包

一,定义:

什么是闭包?闭包,即是函数中包含函数,
* 这里的函数我们可以包含(Lambda表达式,匿名函数,局部函数,对象表达式)。
Lambda/匿名函数 可以访问其外部作用域的变量(如函数内的局部变量),
且会「捕获」这些变量(即使外部函数执行完毕,Lambda 仍可使用这些变量)

外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象。
Kotlin 的闭包可以获取上下文的局部变量,并可以修改它。
实现办法是 Kotlin 编译器给引用的局部变量封装了一层引用

二,例子:

代码:

        //处理按钮点击事件
        binding.button1.setOnClickListener {
            //返回类型为 () -> Int 的表达式
            fun printCalc(): () -> Int {
                var a = 3
                val b = 4
                //返回一个匿名函数
                return {
                    //修改作用域外的变量
                    println("a:${a},b:${b}")
                    a++
                    //读取作用域外的变量
                    a + b
                }
            }

            val pFun = printCalc()
            println("第1次:"+pFun())
            println("第2次:"+pFun.invoke())
            println("第3次:"+pFun())
            println("第4次:"+pFun.invoke())
        }

运行结果:

image

三,例子:

代码:

        //处理按钮点击事件
        binding.button2.setOnClickListener {
            fun greeting(name:String) {
                var age=18
                val hello = {
                    age++
                    println("hello,${name},你今年${age}岁了")
                }
                hello()
                hello.invoke()
            }

            greeting("老王")

            var sum = 0
            val ints = listOf<Int>(2,4,6)
            //foreach参数是一个表达式函数,它在访问外部变量
            ints.forEach {
                sum += it
            }
            println("sum:${sum}")
        }

运行结果:

image

四,例子:

代码:

        //处理按钮点击事件:
        binding.button3.setOnClickListener {
            //返回类型为 () -> Int 的匿名函数
            fun method(b: Int): () -> Int {
                var a = 3
                return fun(): Int {
                    println("a:${a},b:${b}")
                    a++
                    return a + b
                }
            }

            val test = method(3)
            println("第1次调用:"+test())            //7
            println("第2次调用:"+test.invoke())     //8
            println("第3次调用:"+test())            //9
            println("第4次调用:"+test.invoke())     //10
            println("第5次调用:"+test())            //11

        }

运行结果:

image

五,例子:

代码:

        //处理按钮点击事件
        binding.button4.setOnClickListener {
            //捕获参数变量的例子
            fun createMultiplier(factor: Int): (Int) -> Int {
                return { x ->
                    println("factor:${factor}")
                    x * factor
                } // 返回一个闭包,它捕获了factor变量
            }


            val multiplier = createMultiplier(5) // multiplier是一个闭包,它捕获了factor=5
            println(multiplier(10)) // 输出 50
            println(multiplier(20)) // 输出 100
        }

运行结果:

image

posted @ 2025-08-23 09:30  刘宏缔的架构森林  阅读(31)  评论(0)    收藏  举报