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")
}

运行,结果仍然是一样的。

<完>

posted @ 2023-11-06 11:16  夜行过客  阅读(76)  评论(0)    收藏  举报