当前位置:网站首页>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 允许我们重载的运算符和关键字众多,请执行查询
边栏推荐
- Testng listener
- 图的基础概念
- 什么是memoization,它有什么用?
- [MySQL Advanced] Creation and Management of Databases and Tables
- golang写的存储引擎,基于b+树,mmap
- .NET6之MiniAPI(十四):跨域CORS(上)
- 优化查询(工作中)
- noip初赛
- Internet user account information management regulations come into effect today: must crack down on account trading and gray products
- HDU 5655 CA Loves Stick
猜你喜欢

目标检测技术研究现状及发展趋势

LabVIEW code generation error 61056

Cloud platform construction solutions

如何创建一个Web项目

On the Qixi Festival of 2022, I will offer 7 exquisite confession codes, and at the same time teach you to quickly change the source code for your own use
![[N1CTF 2018] eating_cms](/img/09/3599d889d9007eb45c6eab3043f0c4.png)
[N1CTF 2018] eating_cms

2022-08-02 mysql/stonedb慢SQL-Q18-内存使用暴涨分析
Causes of Mysql Disk Holes and Several Ways to Rebuild Tables

【bug】汇总Elipse项目中代码中文乱码解决方法!

【day6】类与对象、封装、构造方法
随机推荐
What is the difference between the generator version and the viewer version?
LabVIEW code generation error 61056
2022-08-02 mysql/stonedb慢SQL-Q18-内存使用暴涨分析
《数字经济全景白皮书》金融数字用户篇 重磅发布!
On the Qixi Festival of 2022, I will offer 7 exquisite confession codes, and at the same time teach you to quickly change the source code for your own use
Quickly build a website with static files
L2-041 插松枝
Network basic learning series four (network layer, data link layer and some other important protocols or technologies)
决策树、GBDT、XGBOOST树的可视化
[N1CTF 2018]eating_cms
HDU 5655 CA Loves Stick
斩获双奖|易知微荣获“2021中国数字孪生解决方案优秀供应商”“中国智能制造优秀推荐产品”双奖项!
趣链的产品构架
466. Count The Repetitions
Embedded systems: overview
Flink--Join以及Flink函数
websocket多线程发送消息报错TEXT_PARTIAL_WRITING--自旋锁替换synchronized独占锁的使用案例
"Digital Economy Panorama White Paper" Financial Digital User Chapter released!
嵌入式系统:时钟
Testng监听器