当前位置:网站首页>Kotlin - 扩展函数和运算符重载
Kotlin - 扩展函数和运算符重载
2022-08-03 22:33:00 【m0_63970488】
一、扩展函数
扩展函数是指不修改某个类的源码情况下,仍然可以打开这个类,向该类添加新的函数。
下面举例一个功能,比如一段字符串中可能包含字符、数字和特殊字符,现在我们希望统计字符串中的字母数量,要怎么实现这个功能呢? 参考一段代码:
object StringUtil {
fun lettersCount(str: String): Int {
var count = 0
for (c in str) {
if (c.isLetter()) {
count++
}
}
return count
}
}
val str = "[email protected]#"
val lettersCount = StringUtil.lettersCount(str)
这种写法绝对可以正常工作,并且这也是JAVA语言中最标椎的实现思维。在Kotlin里有了扩展函数之后就不一样了,比如在Kotlin中可以将lettersCount()函数添加到String类中。
下面我们参考一下扩展函数的语法结构:
fun ClassName.methodName(param1: Int, param2: Int): Int {
return 0
}
相比于定义一个普通函数,扩展函数只需要在函数名前面加上一个ClassName.的语法结构,就表示该函数添加到指定的类当中了。
下面我们由String类距离进行编写,因此我们需要先创建一个String.kt 文件。文件名虽然并没有固定的要求,作者建议向那个类中添加扩展函数,就定义一个同名的Kotlin文件,这样方便以后查找,扩展函数可以定义在任何一个现有的类中,并不一定要创建新的文件,通常我们最好把它定义成顶层方法,这样方便全局访问。
fun String.lettersCount(): Int {
var count = 0;
for (c in this) {
if (c.isLetter()) {
count++
}
}
return count
}
我们将lettersCount方法定义成String的扩展函数,那么函数中就自动拥有了String实例的上下文,因此lettersCount函数就不需要接受一个字符串参数了。直接遍历this即可。
定义好扩展函数后,统计某个字符串的字母数量就可以这样写:
val str = "[email protected]#".lettersCount()
二、运算符重载
在Java中许多语言内置的运算符关键字,如:+-*/%++ --。而Kotlin允许我们将所有的运算符甚至其他的关键字重载,从而拓展这些运算符和关键字的用法。
运算符重载的关键字使用的事operator关键字,只要在指定函数前面加上operator关键字,就可以实现运算符重载的功能了。但问题在于这个指定的函数是什么?这是运算符重载里面比较复杂的一个问题,因为不同的余生南孚对应的重载函数也是不同的,比如加号运算符对应的是plus()函数,减号运算符对应的是minus()函数。
如果两个对象实现相加功能,那么它的语法结构如下:
class Obj {
operator fun plus(obj: Obj){
//处理相加逻辑
}
}
关键字operator和plus都是固定不变的,而切手参数的函数返回值可以根据逻辑自行设定,那么上述代码就表示一个Obj对象可以与另一个Obj对象相加,最终返回一个新的Obj对象。
val obj1 = Obj()
val obj2 = Obj()
val obj3 = obj1 + obj2
下面定义两个Money对象相加,首先定义Money类的结构,这里准备让Money的主构造函数接受一个value参数,用于表示钱的金额 创建Money.kt文件
class Money(val value: Int) {
operator fun plus(money: Money): Money {
val sum = money.value
return Money(sum)
}
}
可以看到,这里使用了operator关键字来修饰plus()函数,这是必不可少的。在plus()函数中,我们将当前的Money和对象value和参数传入的Money对象的value相加,然后得到的和传给一个新的Money对象并将该对象返回。这两个Money就可以相加了。
val money1 = Money(5)
val money2 = Money(10)
val money3 = money2 + money1
Log.d("TAG", "initData: $money3")
这样最终打印出来的结果就是 15。
如果Money对象直接和数字相加的话,就更好了。这个功能当然也是可以实现的。因为Kotlin允许我们对同一个运算符多重重载,代码如下:
class Money(val value: Int) {
operator fun plus(money: Money): Money {
val sum = money.value
return Money(sum)
}
operator fun plus (newValue:Int):Money{
val sum = value+newValue
return Money(sum)
}
}
这里又重载了一个plus()函数,接受的是一个整形数字,其他代码基本是一样的:
val money1 = Money(5)
val money2 = Money(10)
val money3 = money2 + money1
val monet4 = money3 + 20
Log.d("TAG", "initData: $monet4")
Kotlin 允许我们重载的运算符和关键字众多,请执行查询
边栏推荐
- 直播预告 | 构建业务智联,快速拥抱财务数字化转型
- 【day1】
- Research status of target detection at home and abroad
- FinClip最易用的智能电视小程序
- How to write a database document management tool based on WPF (2)
- Flutter 桌面探索 | 自定义可拖拽导航栏
- Quickly build a website with static files
- 【day6】类与对象、封装、构造方法
- Nine ways to teach you to read the file path in the resources directory
- 授人以渔 - 如何自行查询任意 SAP UI5 控件属性的文档和技术实现细节试读版
猜你喜欢
随机推荐
"Digital Economy Panorama White Paper" Financial Digital User Chapter released!
What is the difference between the generator version and the viewer version?
Take an example of a web worker
工作小计 QT打包
嵌入式系统:概述
Golang第一章:入门
Websocket multi-threaded sending message error TEXT_PARTIAL_WRITING--Use case of spin lock replacing synchronized exclusive lock
Golang Chapter 2: Program Structure
UVa 10003 - Cutting Sticks (White Book, Interval DP)
Codeup刷题笔记-简单模拟
Causes of Mysql Disk Holes and Several Ways to Rebuild Tables
目标检测技术研究现状及发展趋势
Analysys Analysis: The transaction scale of China's online retail B2C market in Q2 2022 will reach 2,344.47 billion yuan
云平台建设解决方案
关于IDO预售系统开发技术讲解丨浅谈IDO预售合约系统开发原理分析
Adobe是什么?
2022-08-02 mysql/stonedb慢SQL-Q18-内存使用暴涨分析
With 4 years of work experience, the 5 communication methods between multi-threads can't be said, can you believe it?
488. Zuma Game
pikachu Over permission 越权