美文网首页kotlinkotlin
Kotlin-简约之美-进阶篇(十二):闭包

Kotlin-简约之美-进阶篇(十二):闭包

作者: 门心叼龙 | 来源:发表于2020-02-27 19:26 被阅读0次

    @[toc]

    什么是闭包

    闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

    闭包的作用

    任何支持函数式编程的语言都都支持闭包。

    • 让函数成为编程语言中的一等公民
    • 让函数具有对象所有的能力(封装)
    • 让函数具有状态
      很明显的是java不支持闭包,kotlin的函数成为一等公民,java中对象是一等公民,对象有状态,函数是没有状态的,调用完毕后里面的数据会被回收,不会被保存
    1. java代码
    public class Test {
        public void test(){
            public void test(){
            }
        }
    }
    方法里面 放方法。报错,java没办法理解这种代码,在java中 函数是二等公民
    二等公民是不可以出现在函数里面的。他只能出现在类的定义里
    
    1. kotlin里面
      函数和普通变量一样是一等公民,他可以拥有一等公民拥有的所有主权
    fun test(){
         var a=3
         fun test1(){
         }
    }
    

    好处是显而易见的,可以在函数的内部声明函数,函数参数可以是函数,函数的返回值可以是函数,这就是函数编程的特点 。java的方法里面,传递的参数只能是数据类型,我们定义的对象和基本数据类型,输出的也是数据类型

    普通函数和闭包函数

    普通函数不携带状态,调用完毕后里面所有的内容就会被释放掉。
    下次调用的时候,里面的变量会再次去声明

    fun test(){
        var a=3
        println(a);
    }
    fun main(args: Array<String>) {
        test()
    }
    

    函数不携带状态,维护起来就需要额外的成本,比如我们需要声明一个额外的变量来记录他的状态,闭包让函数可以携带状态。

    fun test():()->Unit{
        var a=3 //状态
        return  fun(){
            a++;
            println(a);
        }
    }
    fun main(args: Array<String>) {
        var t=test()
        t();
        t();
        t();
    }
    

    我们定义了一个函数,返回值是函数 。函数不写返回值,返回值为空的的时候默认为Unit,Unit可以省略不写,当返回值不为空的时候必须写出来

    fun test():()->Unit
    

    冒号后面写小括号表名 函数需要返回一个函数,()里面可以写参数, 小括号后面是函数的返回值类型,我们不可以写冒号了,改为->,但返回值的类型为空的时候也必须写Unit了,不可以省略。

    闭包总结

    函数里面声明函数,函数里面返回函数,就是闭包,函数内部的局部变量的状态保存住了 (变量的值就是状态),局部变量的值被隐藏起来了,但我们调用函数可以改变状态,或者获得局部变量的值,这点就是函数的面向对象,让函数具有封装的能力,让函数既有了状态。

    学习交流

    欢迎入群交流学习,Android、Java开发技术交流群

    相关文章

      网友评论

        本文标题:Kotlin-简约之美-进阶篇(十二):闭包

        本文链接:https://www.haomeiwen.com/subject/xrwxhhtx.html