千家信息网

kotlin之闭包的示例分析

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,小编给大家分享一下kotlin之闭包的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!闭包,函数式编程福音先了解函数
千家信息网最后更新 2025年11月07日kotlin之闭包的示例分析

小编给大家分享一下kotlin之闭包的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

闭包,函数式编程福音

先了解函数式编程(Functional Programming)

概念:它属于"结构化编程"的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。函数式编程语言最重要的基础是λ运算(Lambda表达式),λ运算的函数可以接受函数当做参数或返回值。

对比函数式编程与面向对象编程

面向对象编程(Object-oriented programming,缩写OOP)

面向对象编程是一种具有对象概念的程序编程范型,它可能包含数据、属性、方法。它将对象作为程序的基本单元,将方法和数据封装其中,以提高软件的重用性、灵活性和扩展性。对象里的程序可以访问及经常修改对象相关联的数据。在面向对象编程里,计算机程序会被设计成彼此相关的对象。

面向对象编程的优点

1.程序的结构化

面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,相比传统的面向过程编程将程序看作一系列函数的集合这种无系统化和结构化的模式,面向对象编程将一系列关联性的数据、方法结构化,封装成类,通过类的对象进行方法、属性调用的方式,可以让编程者更加便于分析、设计和理解。

2.程序的灵活性和可维护性

面向对象编程由于集成、封装、多态的特性,可以更好的设计出高内聚、低耦合的系统 结构,使得系统更灵活、更容易扩展,开发及维护成本更低。

面向对象编程的缺点

  1. 运行效率较低
    面向对象虽然开发效率高但是代码运行效率比起面向过程要低很多,这也限制了面向对象的使用场景不能包括那些对性能要求很苛刻的地方

  2. 多线程数据不安全
    面向对象编程以数据为核心,所以在多线程并发编程中,多个线程同时操作数据的时候可能会导致数据修改的不确定性。

函数式编程优点(可以说就是为了解决面向对象的缺点问题而设计的)

  1. 线程安全
    在函数式编程中,数据全部都是不可变的,所以没有并发编程的问题,是多线程安全的,可以有效降低程序运行中所产生的副作用。对于快速迭代的项目来说,函数式编程可以实现函数与函数之间的热切换而不用担心数据的问题,因为它是以函数作为最小单位的,只要函数与函数的关系正确即可保证结果的正确性。

  2. 代码可读性高
    函数式编程的表达方式更加符合人类日常生活中的语法,代码可读性更强。实现同样的功能函数式编程所需要的代码比面向对象编程要少很多,代码更加简洁明晰。

函数式编程的缺点

运行速度更慢
由于所有的数据都是不可变的,所有的变量在程序运行期间都是一直存在的,非常占用运行资源。同时由于函数式的先天性设计导致性能一直不够。虽然现代的汗水编程语言使用了很多技巧,比如惰性计算等优化运行速度,但始终无法与面向对象相比,当然比面向过程的程序就更慢了

了解完函数式编程,再回归今天的主题--闭包

什么是闭包?

我们都知道,程序的变量分为全局变量局部变量,全局变量,顾名思义,其作用域是当前文件甚至文件外的所有地方;而局部变量,我们只能再其有限的作用域里获取。
那么,如何在外部调用局部变量呢?答案就是--闭包,与此给闭包下个定义:闭包就是能够读取其他函数内部变量的函数

  • 它是运行的环境

  • 它持有函数的运行状态

  • 它的内部可以定义函数

  • 它的内部也可以定义类

首先看个简单的例子

//这是一个返回值为一个函数的高阶函数fun makeFun():()->Unit{    var conut = 0    return fun(){   //返回一个匿名函数,这个函数持有count的状态        println(++conut)    }}fun main() {    val makeFun = makeFun() //函数调用,返回一个函数    makeFun()       //调用这个返回的函数,此时makeFun持有makeFun()内部变量的状态    makeFun()    makeFun()}

运行结果:

在比如一个稍微复杂一点的例子,实现斐波那契数列

//斐波那契数列fun fibonacci():()->Long{    var first = 0L    var second = 1L    return fun():Long{  //返回返回值为Long类型的函数        val result = second        second += first        first = second - first        return result    }}fun main() {    val fibo = fibonacci()   //此时,这个返回的函数fibo持有fibonnacci()函数内部变量的状态    println(fibo())    println(fibo())    println(fibo())    println(fibo())    println(fibo())}

测试运行:

使用迭代器实现斐波那契数列

//使用迭代器实现斐波那契数列(这里就不是返回一个函数而是一个对象了)fun fibonacci2():Iterable{    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() {    val fibo2 = fibonacci2()    for (i in fibo2){        if (i>60) break        println(i)    }}

运行结果:

以上是"kotlin之闭包的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

函数 编程 对象 程序 运行 数据 变量 闭包 设计 代码 线程 结构 数列 方法 状态 过程 结构化 分析 安全 作用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 中国古文字数据库 熊猫服务器关闭斗鱼 如何再单元格中隐藏数据库 珠海微信软件开发常见问题 cnki可以查国外哪些数据库 百度云为什么服务器异常 被服务器中断连接 新连华网络技术有限公司怎么样 给儿童讲网络安全 云南电力公司软件开发 plex服务器软解 沧州诺宇网络技术有限公司 服务器自动配置的ip不对 论坛 admin 数据库 服务器数据库被黑客删除了 报案 数据库的还原模式有三种 如何实现数据库连接只能读不能写 网络技术和数据库哪个容易考 档案管理系统服务器配置 e我的世界服务器地址 搜索网络安全的手抄报简单 竹子互联网科技 调用dede数据库 关系数据库的说法中错误的是 阿尔比恩链手游接不到服务器 数据库blob字段 物联网通信与网络技术有哪些应用 软件开发合同中款项怎么写 switch不同服务器区联机 安全数据库系统维护执行标准
0