Kotlin笔记(三):扩展函数,运算符重载

news2024/11/19 20:34:26

1. 扩展函数

 扩展函数表示即使在不修改某个类的源码的情况下,仍然可以打开这个类,向该类添加新的函数。

 在Java中,如果我们需要统计字符串中的字母的数量的话,我们通常需要建立一个工具类,然后在工具类里面创建一个新的方法来实现该功能. 在Kotlin中,由于扩展函数功能的存在,我们可以直接在String类中扩展出新的方法,来实现该功能.

1.1 扩展函数的语法

 扩展函数的语法结构如下:

fun ClassName.methodName(param1: Int, param2: Int): Int {
 	return 0
}

 相比于定义一个普通的函数,定义扩展函数只需要在函数名的前面加上一个ClassName.的语
法结构,就表示将该函数添加到指定类当中了。

1.2 扩展函数的实现

 文件名虽然并没有固定的要求,但是我建议向哪个类中添加扩展函数,就定义一个同名的Kotlin文件,这样便于你以后查找。当然,扩展函数也是可以定义在任何一个现有类当中的,并不一定非要创建新文件。不过通常来说,最好将它定义成顶层方法,这样可以让扩展函数拥有全局的访问域。

 现在在String.kt文件中编写如下代码:

fun String.lettersCount(): Int {
 	var count = 0
 	for (char in this) {
 		if (char.isLetter()) {
 			count++
 		}
 	}
 	return count
}

 我们将lettersCount()方法定义成了String类的扩展函数,那么函数中就自动拥有了String实例的上下文。因此lettersCount()函数就不再需要接收一个字符串参数了,而是直接遍历this即可,因为现在this就代表着字符串本身。

&emps;扩展函数在很多情况下可以让API变得更加简洁、丰富,更加面向对象。我们再次以String类为例,这是一个final类,任何一个类都不可以继承它,也就是说它的API只有固定的那些而已,至少在Java中就是如此。然而到了Kotlin中就不一样了,我们可以向String类中扩展任何函数,使它的API变得更加丰富。比如,你会发现Kotlin中的String甚至还有reverse()函数用于反转字符串,capitalize()函数用于对首字母进行大写,等等,这都是Kotlin语言自带的一些扩展函数。这个特性使我们的编程工作可以变得更加简便。

 不要被示例内容所局限,除了String类之外,你还可以向任何类中添加扩展函数,Kotlin对此基本没有限制。

2. 运算符重载

 在Java中也存在运算符重载:用+来连接字符串,但是Java不支持自定义运算符重载功能. 而Kotlin允许我们将所有的运算符甚至其他的关键字进行重载,从而拓展这些运算符和关键字的用法。

2.1 运算符重载语法

 运算符重载使用的是operator关键字,只要在指定函数的前面加上operator关键字,就可以实现运算符重载的功能了。但问题在于这个指定函数是什么?这是运算符重载里面比较复杂的一个问题,因为不同的运算符对应的重载函数也是不同的。比如说加号运算符对应的是plus()函数,减号运算符对应的是minus()函数。

 我们这里还是以加号运算符为例,如果想要实现让两个对象相加的功能,那么它的语法结构如下:

class Obj {
 	operator fun plus(obj: Obj): Obj {
 	// 处理相加的逻辑
 	}
}

 在上述语法结构中,关键字operator和函数名plus都是固定不变的,而接收的参数和函数返
回值可以根据你的逻辑自行设定。那么上述代码就表示一个Obj对象可以与另一个Obj对象相
加,最终返回一个新的Obj对象。对应的调用方式如下:

val obj1 = Obj()
val obj2 = Obj()
val obj3 = obj1 + obj2

 这种obj1 + obj2的语法看上去好像很神奇,但其实这就是Kotlin给我们提供的一种语法糖,
它会在编译的时候被转换成obj1.plus(obj2)的调用方式。

 了解了运算符重载的基本语法之后,下面我们开始实现一个更加有意义功能:让两个Money对
象相加。

 首先定义Money类的结构,这里我准备让Money的主构造函数接收一个value参数,用于表示钱的金额。创建Money.kt文件,定义好了Money类的结构,接下来我们就使用运算符重载来实现让两个Money对象相加的功能:

class Money(val value: Int) {
 	operator fun plus(money: Money): Money {
 		val sum = value + money.value
 	return Money(sum)
 	}
}

 可以看到,这里使用了operator关键字来修饰plus()函数,这是必不可少的。在plus()函数中,我们将当前Money对象的value和参数传入的Money对象的value相加,然后将得到的和传给一个新的Money对象并将该对象返回。这样两个Money对象就可以相加了,就是这么简单。

 但是,Money对象只允许和另一个Money对象相加,有没有觉得这样不够方便呢?或许你会觉
得,如果Money对象能够直接和数字相加的话,就更好了。这个功能当然也是可以实现的,因为Kotlin允许我们对同一个运算符进行多重重载,代码如下所示:

class Money(val value: Int) {
 	operator fun plus(money: Money): Money {
 		val sum = value + money.value
 		return Money(sum)
 	}
 	operator fun plus(newValue: Int): Money {
 		val sum = value + newValue
 		return Money(sum)
 	}
}

2.2 语法糖表达式和实际调用函数对照表

在这里插入图片描述

 注意,最后一个a in b的语法糖表达式对应的实际调用函数是b.contains(a),a、b对象的顺序是反过来的。这在语义上很好理解,因为a in b表示判断a是否在b当中,而b.contains(a)表示判断b是否包含a,因此这两种表达方式是等价的。

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

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

相关文章

油猴脚本百度网盘不限速(亲测有效)

安装油猴[Tampermonkey]插件 打开浏览器(我用的是Chrome),然后点击右上角【…】,在出来的菜单里,选择【更多工具】然后点击【扩展程序】。 然后点击左上角三条杠 点击下方打开Chrome网上应用商店 搜索【Tampermonkey】…

中电金信鲸视:以AI视觉技术为复杂行业场景装上“火眼金睛”

作为人工智能和计算机视觉的交叉领域,智能视觉通过仿生人类视觉机能,对不同形式的视觉输入进行处理、理解和决策。现今,智能视觉已成为应用广泛、市场覆盖大、形式多样的产业方向,得到了国家政策的大力支持。 如在科技部等六部门印…

电脑桌面怎样设置闹钟提醒?电脑上定闹钟的方法

想必大家在日常工作生活中都会遇到各种需要提醒的场景,例如提醒参加会议、提醒完成重要工作任务、提醒休息等。而在电脑桌面上设置闹钟提醒,成为了许多人的需求。然而,在Windows电脑上设置闹钟提醒的方法常常复杂繁琐,让我们不得不…

MySQL 4 MySQL使用演示(包含基本操作命令~~~)MySQL5.7编码设置

目录 1 MySQL的使用演示(8.0和5.7版本对比) 1、查看所有的数据库 2、创建自己的数据库 3、使用自己的数据库 4、查看某个库的所有表格 5、创建新的表格 6、查看一个表的数据 7、添加一条记录 8、查看表的创建信息 9、查看数据库的创建信息 …

pip安装总是失败怎么办

换国内好几个镜像也是总是失败,这里不再说这种方法,主要讲将本地安装 WHL文件安装 首先,要从官网(https://pypi.org/project/)上下载指定的.whl文件,进入官网后搜索Flask-SQLAlchemy,选择最近版本点击,在Do…

ICC2:skip route

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 一些net,不需要工具去绕线的时候可以用skip route功能,可以是没绕线,不需要绕线的情况,也可以是绕了线不希望被工具动到的情况。…

计算机基础知识32

Socket抽象层(socket编程) # Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单 的接口供应用层调用已实现进程在网络中通信 socket () 对象 bind () 函数来绑定 listen () 监听,等别人电话 accept(&#…

C++使用openssl对AES-256-ECB PKCS7 加解密

/** AES-256-ECB PKCS7 加密 函数* input:经过PKCS7填充后的明文数据* outhex:加密后的命名数据16进制数,可以使用base64_encode转换为base64格式字符串密文* key:密钥* len:经过PKCS7填充后的明文数据长度*/ void AesEcb256Pkcs7Encrypt(u8 *input, u8 *outhex, u8 *key, int …

18.项目开发之前端项目搭建测试

项目开发之前端项目搭建测试 解压文件,将前端项目目录,拖拽到HBuilder中 前端项目QuantTrade_vue地址:传送门 后端项目QuantTrade地址: https://pan.baidu.com/s/1GF45B0QepApH8JbRIOLY7w?pwd1016 开启idea的项目,先…

连连国际:助力跨境卖家在TikTok Shop全球平台轻松收款

数字化时代的崛起已经改变了人们的生活方式,也彻底颠覆了传统商业模式。社交媒体平台,如TikTok,已经不仅仅是人们分享生活的地方,也成为了商业增长的重要渠道之一。 TikTok Shop,作为TikTok社交媒体巨头的电子商务延伸…

换低挡装置(Kickdown, ACM/ICPC NEERC 2006, UVa1588)rust解法

给出两个长度分别为n1,n2(n1,n2≤100)且每列高度只为1或2的长条。需要将它们放入一个高度为3的容器(如图3-8所示),问能够容纳它们的最短容器长度。 样例 2112112112 2212112 1012121212 2121…

使用 Github Actions 工作流自动部署 Github Pages

GitHub-Actions actions顾名思义就是一堆动作,是一个持续集成服务,持续集成包含了拉代码、运行测试、编译代码、登录远程服务器,发布到第三方服务等等的操作,GitHub将这些操作称为actions。 概念:Workflows, Events,…

fastDFS实现文件上传与下载

前言 我们在做项目的时候经常会遇到文件的上传与下载。你们是怎么做的呢?现在有一个技术可以非常简单的实现这个功能——fastDFS 简介 FastDFS是一个分布式文件系统,使用FastDFS可以非常容易搭建一套高性能的文件服务器集群提供文件上传、下载服务。 …

RocketMq(六)消息传输方式

在前面的基础上, 一、消息传输方式:在RocketMQ中,可以通过设置消费组的方式实现消息的广播和点对点传输。 1、默认方式:多个消费者轮询消费,若只有一个消费者则全部消费。通过下面的举例可以看到这其实就是点对点模式。 (1&…

Rockchip 3588 开关HDMI

需求 上层Android要控制hdmi,dp等等(带有节点的功能)的开关,配置,获取状态。 方案 我们可以从Settings的源码中找到方法: 从HdmiSettings.java的源码中可以看到如下注释: 相关节点定义: 控制函数如下&…

云服务器ip使用细节(公网、私有)

场景: 当我们对tcp服务器进行监听的时候,可能需要用到ip地址,比如使用httplib::Service::listen(ip, port),而当我们访问tcp服务器时也需要ip地址 但这两个ip是不同的! 每个云服务器通常都会有一个公网IP地址和一个私有…

Redis删除过期key策略

文章目录 前言Redis中key的的过期时间在创建 key 时使用 EXPIRE 命令设置过期时间(秒级)使用 EXPIREAT 命令设置一个精确的过期时间(unix 时间戳)使用 PEXPIRE 命令设置过期时间(毫秒级)使用 PEXPIREAT 命令设置毫秒级精确过期时间在 Redis 配置文件中设置所有 key 的默认过期时…

C语言--好题

目录 题目一:二维数组传参 题目二: malloc开辟二维数组 题目三: 位段 题目四: 联合体 题目五:位段 题目六:找单身狗2 题目一:二维数组传参 下面代码中print_arr函数参数设计哪个是正确的…

某985证书站挖掘记录

0x1.前言 ​ 本文章仅用于信息安全防御技术分享,因用于其他用途而产生不良后果,作者不承担任何法律责任,请严格遵循中华人民共和国相关法律法规,禁止做一切违法犯罪行为。文中涉及漏洞均以提交至教育漏洞平台,现已修复…

​ModbusTCP转Profibus-DP从站网关把modbus的数据传到300plc上的应用方法​​

远创智控YC-DPS-TCP,让Profibus和ModbusTcp总线之间的通讯协议转换更简单。 远创智控YC-DPS-TCP 是一种将Profibus和ModbusTcp总线连接的通讯协议转换设备。这个设备非常符合ModbusTcp协议的设备,比如各种仪表、传感器、交换机等,它们可以通过…