参考:https://blog.csdn.net/weixin_38244174/article/details/106002834
Kotlin之扩展函数和运算符重载
1、扩展函数 扩展函数是指在不改边某个类源码的情况下,依然可以打开这个类,并向该类提供新的函数。举例来讲:字符串包含字母、数字和特殊符号,统计字符串中字母的数量。
扩展函数的语法结构如下,相比于定义普通函数,我们只需要在前面加上一个ClassName.的语法结构,就可以将该函数添加到指定类中。
fun ClassName.methodName(param1:Int,param2:Int):Int{
return 0
}
下面往String类中添加一个扩展函数,首先创建String.kt文件,将其定义成顶层方法一遍拥有全局访问域。
package com.company
fun String.letterCount(): Int {
var count = 0
for (char in this) {
if (char.isLetter()) {
count++
}
}
return count
}
println(str.letterCount())
2、.有趣的运算符重载 运算符重载是Kotlin中一个有趣的语法。运算符包括±*/%等,Kotlin运算符重载允许任意两个对象相加或者更多其他操作。譬如两个Money对象相加。 运算符重载使用的是operator关键字,在指定函数前面使用operaor关键字,就可以实现运算符重载了。譬如加号运算符对应的是plus函数,减号对应的是minus函数。举例,完成两个Money对象的相加。
package com.company
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)
}
}
package com.company
fun main() {
val money1 = Money(5)
val money2 = Money(10)
val money3 = money1 + money2
println(money3.value)
}
举例来讲,我们在前面使用了一个随机生成字符串长度的函数,如果使用str*n岂不是很棒?
fun getRandomLengthString(str: String): String {
val n = (1..20).random()
var builder = StringBuilder()
repeat(n) {
builder.append(str)
}
return builder.toString()
}
前面的扩展函数,扩展了String
operator fun String.times(n: Int): String {
var builder = StringBuilder()
repeat(n) {
builder.append(this)
}
return builder.toString()
}
val str = "abc" * 10
println(str)
需要说明的是String类已经提供了将字符串重复n遍的repeat函数,因此可以进一步精简为:
operator fun String.times(n: Int): String = repeat(n)
最后重复任意次数的字符串代码如下:
fun getRandomLengthString(str: String): String = str * (1..20).random()
|