Kotlin函数和对象

1.高阶函数

如果一个函数的参数是函数类型或者返回值是函数类型,那么这个函数就是高阶函数。
在kotlin中函数也是有类型的,跟整型、字符串类型是同样的性质,函数类型就是将函数的“输入参数类型”和“返回值类型”的抽象表达,如(Int,Int)-> Int

2.扩展函数

kotlin允许为现有的类添加新方法,这就叫拓展函数。扩展函数在语法上看起来就像是类的原生方法一样,但实际上是在类的外部定义,因此,它不能访问类的私有或受保护的成员,同时也不能在类的内部调用。拓展函数可以搭配高阶函数一起使用,组成拓展高阶函数。如下是给SharedPreferences拓展了一个edit高阶函数:

    // 定义扩展高阶函数// 并且函数接收类型是SharedPreferences.Editor,即高阶函数内部自带SharedPreferences.Editor的上下文//扩展函数可以在其他类中被调用,允许导包的方式,把这个函数导入到其他类中;并且可以使用as来做重命名,如:import com.coolweather.coolweatherjetpack.data.db.WeatherDao.edit as customEditfun SharedPreferences.edit(action: SharedPreferences.Editor.() -> Unit) {var editor = edit()action(editor)editor.apply()}

3.内联函数

当函数被标记为inline时,表示这是一个内联函数,编译器会尝试在调用该函数的地方直接插入函数的实现代码,而不是生成调用函数的代码,从而消除函数调用的开销。这种优化在小型、频繁被调用的函数特别有用,提到执行的效率。
但是内联函数并不一定总是被内联,编译器会根据函数的体积、被调用的频率来决定是否直接生成函数代码。同时,内联函数也会导致代码膨胀,导致代码体积变大,因此需要谨慎使用。
例如如下函数:

inline fun maxOf(a: Int, b: Int): Int {return if (a > b) a else b
}

当maxOf被调用的时候,编译器会选择直接在调用点插入if (a > b) a else b这段代码。
又例如高阶函数:

// 使用inline的高阶函数
inline fun fooInline(block: () -> Unit) {block()
}
// 假如多次调用
fun testInlined() {var i = 0fooInline {fooInline {fooInline {fooInline {                   i++                         }}}}
}

根据内联函数的原理,上面的函数在编译后等价于:

fun testInlined() {var i = 0i++
}

4.伴生对象

伴生对象在kotlin中使用companion object关键字定义,它允许在不创建类的实例的情况下访问类的属性和方法。kotlin中没有静态成员的概念,为了弥补这一功能的缺失,kotlin中引入了伴生对象的概念。

class MyClass {companion object {// 伴生对象的属性和方法const val CONSTANT = "Constant Value"fun printConstant() {println(CONSTANT)}}// 类的其他属性和方法fun doSomething() {// ...}
}// 使用伴生对象
MyClass.CONSTANT // 访问伴生对象的属性
MyClass.printConstant() // 调用伴生对象的方法

5.单例模式

使用object ClassName的方式,可以实现饿汉式单例模式;
通过私有化构造器,使用伴生对象的方式,可以实现懒汉式单例模式,同时允许在获取单例对象的时候传入参数

参考文章《Kotlin 高阶函数详解》,链接:https://zhuanlan.zhihu.com/p/495402574

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/690291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#使用MiniExcel导入导出数据到Excel/CSV文件

MiniExcel简介 简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。 目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB&#xff…

论文阅读,ProtoGen: Automatically Generating Directory Cache Coherence Protocols(三)

目录 一、Article:文献出处(方便再次搜索) (1)作者 (2)文献题目 (3)文献时间 (4)引用 二、Data:文献数据(总结归纳,方便理解&am…

扫地机器人与项目管理

最近家里新装了一台扫地机器人,可以远程操控,每次回家前,都让它扫拖一遍,非常的干净。家里东西摆放比较杂乱,每次它要清理的面积都是一个不规则图形。通过几次的观察,发现它总是把要清理的区域先整个画一个…

1057:简单计算器

题目描述】 一个最简单的计算器,支持, -, *, / 四种运算。仅需考虑输入输出为整数的情况,数据和运算结果不会超过int表示的范围。然而: 1. 如果出现除数为0的情况,则输出:Divided by zero! 2. 如果出现无效的操作符(即…

TCP如何保证传输可靠性?

文章目录 前言1、连接管理1.1、三次握手1.2、四次挥手 2、校验和3、序列号 确认应答4、重传机制4.1、超时重传4.2、快速重传 5、流量控制5.1、累计应答5.2、滑动窗口 6、拥塞控制6.1、慢启动6.2、拥塞避免6.3、拥塞发生6.4、快速恢复 前言 文章参考: 《网络是怎样…

「年后复工主题」app用户运营拉新,接入引爆用户增长的活动

随着春节假期的结束,人们重返工作岗位,各行各业也迎来了年后复工的高峰期。在这个时间节点,APP运营团队面临着一个绝佳的机遇——利用节日余温和复工活力,通过策划一系列相关主题的趣味活动来吸引新用户,实现用户增长的…

文件上传漏洞--Upload-labs--Pass06--空格绕过

一、什么是空格绕过 在Windows系统中,Windows特性会自动删除文件后缀名后的空格,这使我们看 .php 和 .php 二者没有任何区别,实际上二者是有区别的。若网页源码没有使用 trim()函数 来进行去除空格的操作,就会使网页存在 空格绕…

什么样的服务器是高性能服务器?

首先,高性能服务器应具备高处理能力。随着业务的不断扩展和数据量的爆炸性增长,高性能服务器需要具备强大的计算能力,能够快速处理各种复杂的业务和数据。这要求高性能服务器采用先进的处理器技术,如多核处理器、GPU加速等&#x…

IDEA中创建web项目(配置tomcat,tomcat启动报程序包javax.servlet.http不存在,tomcat控制台乱码问题)

文章目录 一、新建动态web项目1、新建项目2、选择创建动态web项目3、项目命名4、编辑index.jsp 二、配置Tomcat1、新增tomcat服务器配置2、选择服务器类型3、配置服务器参数4、部署项目5、完成配置6、启动运行7、访问web项目 三、tomcat启动报程序包javax.servlet.http不存在四…

个人简历补充

个人简历补充 1.对工作的认识2.八股文和知识面3.框架/架构角度深扒3.1 前端3.1.1 mPaaS(移动领域)3.1.2 普通前端项目框架3.1.3 微前端 3.2 后端 持续更新 1.对工作的认识 2.八股文和知识面 前端(基础知识 / 开发能力 / 总结输出能力&#xf…

vue-productionSourceMap作用

当其设置为false时(productionSourceMap: false) 当其设置为true时(productionSourceMap: true) 注:1.当设置为true时,打包后每个文件都有一个.map文件,其目的是为了精确定位代码错误 2.当设置为false时,可减少项目打包大小 3.正式环境禁止使用true,因为其可通过反编译.map文件…

HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-UART

目录 一、UART 概述二、UART 模块相关API三、UART 接口调用实例四、UART HDF驱动开发4.1、开发步骤(待续...) 坚持就有收获 一、UART 概述 UART 是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)的缩写,是通用串行数据总…

调用百度文心AI作画API实现中文-图像跨模态生成

作者介绍 乔冠华,女,西安工程大学电子信息学院,2020级硕士研究生,张宏伟人工智能课题组。 研究方向:机器视觉与人工智能。 电子邮件:1078914066qq.com 一.文心AI作画API介绍 1. 文心AI作画 文…

上传(图片)文件的功能实现

说句实话,现在的开发简单多了。因为有现成的第三方的上传文件的代码。如果放在我们以前做开发,上传文件的代码都得自己写。 那现在的程序员面对上传文件的功能到底写啥代码。 1)、对于前端人员:就是把后端的请求地址&#xff0c…

阿基米德签证小程序管理系统功能清单

阿基米德签证小程序管理系统,底层架构采用当前国内最流行的php框架thinkphp8.0、采用广泛使用的MYSQL数据库,管理后台前后台分离,同时使用了当今最流行的基于VUE3和elementPlus前端框架,小程序采用了支持多端合一的UNI-APP开发&am…

Kernel 地图

前言 在 Linux Kernel 中,根据 Makefile 和 Kconfig,可以快速地了解一个小的内核子系统。所以我将这两个文件称之为 Kernel 地图。 Kernel 地图 基本上,Linux 内核中,每一个目录下面都有一个 Makefile 和一个 Kconfig 文件。这…

docker 安装达梦dm8 包含lincese

1.加载达梦数据库docker镜像 dm_v8.1.1.66_x86_rh7_64_ent.tar为申请的镜像文件。 docker load -i dm_v8.1.1.66_x86_rh7_64_ent.tar 查看镜像 docker images 创建达梦数据库容器 执行创建命令: docker run -d -p 30236:5236 --restartalways --name dm8_test…

Day11-Linux系统iNode及链接知识及企业按哪里精讲

Day11-Linux系统iNode及链接知识及企业按哪里精讲 1. 文件核心 属性知识1.1 什么是索引节点(inode)。1.2 索引节点作用1.3 inode是怎么产生的?1.4 inode的特点?1.5 Linux系统读取文件的原理1.6 企业生产案例:No space …

行人重识别综述

Deep Learning for Person Re-identification: A Survey and Outlook 论文地址https://arxiv.org/pdf/2001.04193 1. 摘要 we categorize it into the closed-world and open-world settings. closed-world:学术环境下 open-world :实际应用场景下 2…

Python系列(15)—— int类型转string类型

Python中的int类型转string类型 一、引言 在Python编程中,我们经常会遇到需要将整数(int)类型转换为字符串(string)类型的情况。例如,当我们需要将数字与文本结合时,或者当我们需要将数字写入…