广告
返回顶部
首页 > 资讯 > 后端开发 > Python >kotlin之闭包案例详解
  • 781
分享到

kotlin之闭包案例详解

2024-04-02 19:04:59 781人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

闭包,函数式编程福音 先了解函数式编程(Functional Programming) 概念:它属于“结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。函数式编程

闭包,函数式编程福音

先了解函数式编程(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<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() {
    val fibo2 = fibonacci2()
    for (i in fibo2){
        if (i>60) break
        println(i)
    }
}

运行结果:

在这里插入图片描述

到此这篇关于Kotlin之闭包案例详解的文章就介绍到这了,更多相关kotlin之闭包内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: kotlin之闭包案例详解

本文链接: https://www.lsjlt.com/news/134404.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • kotlin之闭包案例详解
    闭包,函数式编程福音 先了解函数式编程(Functional Programming) 概念:它属于“结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。函数式编程...
    99+
    2022-11-12
  • kotlin 之单例类详解
    object 单例对象的声明: object Model{ var temp = "1" val temp2 = "2" const val temp3 = "3"} 抛出疑问:使...
    99+
    2023-09-02
    kotlin java
  • Kotlin lateinit与by lazy案例详解
    lateinit 和 lazy 是 Kotlin 中的两种不同的延迟初始化的实现 lateinit 只用于变量 var,而 lazy 只用于常量 val lazy 应用于单例模式(...
    99+
    2022-11-12
  • Android Kotlin使用SQLite案例详解
    Kotlin使用SQLite 首先确定我们的目标,SQLite只是一种工具,我们需要掌握就是增删改查就可以,我们真正需要动脑的还是项目中的业务逻辑。我这篇文章写得比较适合新手,没用过...
    99+
    2022-11-12
  • Python 中闭包与装饰器案例详解
    目录1.Python中一切皆对象2.函数式第一类对象3.函数对象 vs 函数调用4.闭包&LEGB法则5.装饰器&语法糖(syntax sugar)6. 回归问题项目...
    99+
    2022-11-12
  • Python闭包与闭包陷阱举例详解
    目录1 什么是闭包2 闭包示例代码3 什么是闭包陷阱4 闭包陷阱代码实例4.2 第二组代码实例总结1 什么是闭包 在 Python 中,闭包是一种特殊的函数,它能够记住它所在的环境(...
    99+
    2023-01-28
    python中闭包的概念 python闭包详解 Python闭包
  • JavaScript高级之闭包详解
    目录1. 闭包的概念知识点的补充:2. 闭包的作用:3. 闭包示例3.1 点击li,输出当前li的索引号总结1. 闭包的概念 来看一般函数的执行和启发: func...
    99+
    2022-11-12
  • python闭包的实例详解
    1、在外部函数中定义内部函数,内部函数包含访问外部函数。即使外部函数的生命周期结束后,内部函数仍然可以访问外部函数变量。 2、外部函数的返回值是内部函数本身。 实例 def ou...
    99+
    2022-11-12
  • Android之AttributeSet案例详解
    public interface AttributeSet { public int getAttributeCount(); public...
    99+
    2022-11-12
  • Java之HashMap案例详解
    概述 这篇文章,我们打算探索一下Java集合(Collections)框架中Map接口中HashMap的实现。Map虽然是Collctions框架的一部分,但是Map并没有实现Col...
    99+
    2022-11-12
  • Java之Algorithm_analysis案例详解
    public class BubbleSort { public void sort(int[] array){ for(int i=1;i<...
    99+
    2022-11-12
  • Vue之TodoList案例详解
    <template> <div id="root"> <div class="todo-container"> ...
    99+
    2022-11-12
  • Java Thread之Sleep()案例详解
    一、API简介 Thread.sleep()是Thread类的一个静态方法,使当前线程休眠,进入阻塞状态(暂停执行),如果线程在睡眠状态被中断,将会抛出IterruptedExcep...
    99+
    2022-11-12
  • Java之OutputStreamWriter流案例详解
    一、OutputStreamWriter流     API说明:OutputStreamWriter是从字符流到字节流的桥接:使用指定的字符集将写入其中...
    99+
    2022-11-12
  • Kotlin修饰符lateinit(延迟初始化)案例详解
    Kotlin定义变量一般有如下写法 lateinit var name: String var age: String? = null 那么用latein...
    99+
    2022-11-12
  • kotlin实现语音聊天机器人案例详解
    目录一.机器人聊天—对话adapter的实现二.机器人聊天—机器人实时对话实现此篇文章紧做关于语音机器人聊天开发,后续功能实现请关注后续文章!!! 此篇文章完...
    99+
    2023-02-16
    kotlin语音聊天机器人 kotlin语音机器人 kotlin聊天机器人
  • Swift中转义闭包示例详解
    目录前言转义与非转义闭包逃离方法将转义关闭付诸行动注意强参考周期内存泄漏背后的原因消除强引用循环概括前言 Swift 是一种非常强大的编程语言,是为 Apple 生态系统开发应用程序...
    99+
    2022-11-12
  • Kotlin this详解及实例
    Kotlin this详解及实例为了表示当前函数的接收者(receiver), 们使用this表达式: 在类的成员函数中,this指向这个类的当前对象实例; 在扩展函数中,或带接收者的函数字面值(function literal) 中,...
    99+
    2023-05-31
    kotlin this his
  • Java注解之Elasticsearch的案例详解
    学会了技术就要使用,否则很容易忘记,因为自然界压根就不存在什么代码、变量之类的玩意,这都是一些和生活常识格格不入的东西。只能多用多练,形成肌肉记忆才行。 在一次实际的产品开发中,由于...
    99+
    2022-11-13
    Java注解 Elasticsearch Java Elasticsearch
  • Kotlin-Android之Activity使用详解
    目录Activity中Toast的使用Activity中不使用findViewById()获取控件IDActivity中使用菜单MenuActivity中intent的使用inten...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作