Kotlin基础知识_07-扩展函数_运算符重载
Kotlin基础知识_07-扩展函数&运算符重载
1. 扩展函数
可以为指定的类添加新的API,以扩展当前类的功能:
ex 计算指定字符串中字母的个数:
fun String.calculateLetterNum(): Int {
var num = 0
for (c in this) {
if (c.isLetter()) {
num++
}
}
return num
}
fun main() {
val str = "abd!@#$#dfdb7###@"
println("The letter num: ${str.calculateLetterNum()}")
}
输出:
The letter num: 7
2. 运算符重载
可以根据需要对现有的运算符进行重载,以获得更好的语义。
运算符重载使用的是operator关键字,只要在指定函数的前面加上operator关键字,就可以实现运算符重载的功能了。但问题在于这个指定函数是什么?这是运算符重载里面比较复杂的一个问题,因为不同的运算符对应的重载函数也是不同的。比如说加号运算符对应的是plus()函数,减号运算符对应的是minus()函数。
具体运算符与函数的对照关系可参考下表:
| 运算符 | 实际调用的函数 |
|---|---|
| a + b | a.plus(b) |
| a - b | a.minus(b) |
| a * b | a.times(b) |
| a / b | a.div(b) |
| a % b | a.rem(b) |
| a++ | a.inc() |
| a-- | a.dec() |
| +a | a.unaryPlus() |
| -a | a.unaryMinus() |
| !a | a.not() |
| a == b | a.equals(b) |
| a > b | 与 a == b 同,为 a.equals(b) |
| a < b | 与 a == b 同,为 a.equals(b) |
| a >= b | 与 a == b 同,为 a.equals(b) |
| a <= b | 与 a == b 同,为 a.equals(b) |
| a..b | a.rangeTo(b) |
| a[b] | a.get(b) |
| a[b] = c | a.set(b, c) |
| a in b | b.contains(a) |
ex: 1. 让两个对象相加:
class Money(val value: Int) {
/**
* 重载加号运算符,以允许两个对象相加
*/
operator fun plus(money: Money): Money {
val newValue = value + money.value
return Money(newValue)
}
/**
* 再次重载加号运算符,以允许对象和数字相加
*/
operator fun plus(money: Int): Money {
val newValue = value + money
return Money(newValue)
}
}
fun main() {
val money1 = Money(30)
val money2 = Money(40)
val money3 = 50
val money4 = money1 + money2
val money5 = money2 + money3
println("money4: ${money4.value}, money5: ${money5.value}")
}
运行:
money4: 70, money5: 90
ex:2. 让字符串重复N次
operator fun String.times(num: Int): String {
val builder = StringBuilder()
repeat(num) {
builder.append(this)
}
return builder.toString()
}
fun main() {
val str = "Abcd"
val newStr = str * 4
println("newStr: $newStr")
}
运行:
newStr: AbcdAbcdAbcdAbcd
Tips: Kotlin的String类中已经提供了一个用于将字符串重复n遍的
repeat()函数,因此times()函数还可以进一步精简成如下形式operator fun String.times(num: Int): String = repeat(num) fun main() { val str = "Abcd" val newStr = str * 4 println("newStr: $newStr") }运行,结果仍然是一样的。
<完>

浙公网安备 33010602011771号