上一篇:Kotlin一步一步學(xué)(三) -- 延遲初始化和密封類
擴展函數(shù)
擴展函數(shù)表示即使在不修改某個類源碼的前提下,仍可以打開這個類,向該類添加新的函數(shù)。現(xiàn)代很多編程語言都實現(xiàn)了擴展函數(shù),可Java卻一直沒有實現(xiàn)這個實用的功能糕殉。值得高興的是,Kotlin早早就對擴展函數(shù)進行了很好的支持。
案例:一段隨機字符串中包含字母山害、數(shù)字和特殊字符等,簡單統(tǒng)計一下字符串中有很多個字母沿量。
普通編碼寫法
定義一個工具類浪慌,然后使用for-in循環(huán)去遍歷字符串中的每一個字符。如果該字符是字母的話朴则,那就將計數(shù)器加1,最終返回計數(shù)器的值权纤。代碼如下所示
object StringUtil {
fun lettersCount(str: String): Int {
var count = 0
for (char in str) { //循環(huán)遍歷
if (char.isLetter()) {
count++;
}
}
return count
}
}
//調(diào)用方式
val str = "1234abcd@#$"
val count = StringUtil.lettersCount(str)
擴展函數(shù)簡化寫法
有了擴展函數(shù)后,我們可以用一種更加面向?qū)ο蟮乃季S來實現(xiàn)這個功能乌妒,比如說將lettersCount()函數(shù)添加到String類中汹想。定義擴展函數(shù)非常簡單,只需要在函數(shù)名前面加一個ClassName.的語法結(jié)構(gòu)撤蚊,就表示將該函數(shù)添加到指定類當(dāng)中了古掏。優(yōu)化代碼如下所示
fun String.lettersCount(): Int {
var count = 0
for (char in this) { //循環(huán)遍歷
if (char.isLetter()) {
count++;
}
}
return count
}
//調(diào)用方式
val count = "1234abcd@#$".lettersCount()
是不是很神奇,就像是String類中自帶了lettersCount()方法一樣侦啸,這樣用起來簡直爽爆了槽唾。
運算符重載operator
運算符重載是Kotlin提供的一個有趣的語法糖。Java中內(nèi)置了許多的運算符關(guān)鍵字光涂,如+ - * / % 等等∨悠迹現(xiàn)在Kotlin允許我們將所有的運算符進行重載,從而拓展這些運算符和關(guān)鍵字的用法顶捷。
運算符重載使用的是operator
關(guān)鍵字挂绰,只要在指定函數(shù)的前面加上operator
關(guān)鍵字,就可以實現(xiàn)運算符重載的功能。
案例:定義一個Money類葵蒂,讓Money的主構(gòu)造函數(shù)接收一個value參數(shù)交播,用于表示錢的金額。我們要實現(xiàn)的功能是讓兩個Money對象相加践付。代碼如下所示
class Money(val value: Int) {
operator fun plus(money: Money): Money {
val sum = value + money.value //將當(dāng)前Money對象的value和傳入的value值進行相加
return Money(sum) //將得到的和傳給一個新的Money對象并將其返回秦士。這樣兩個Money就相加了。
}
}
val money1 = Money(1)
val money2 = Money(2)
val money3 = money1+money2
println(money3.value) //輸出值為3
是不是很神奇永高,這樣就實現(xiàn)了Money的相加隧土,通過重載運算符“+”來實現(xiàn)。
Kotlin允許我們重載的運算符和關(guān)鍵字多達十幾個命爬。下面我列出常用的可重載運算符對應(yīng)的語法糖表達式曹傀,以及它們會被轉(zhuǎn)換成的實際調(diào)用函數(shù)。
語法糖表達式 | 實際調(diào)用函數(shù) |
---|---|
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.mod(b) (已棄用) |
a++ | a.inc() |
a-- | a.dec() |
+a | a.unaryPlus |
-a | a.unaryMinus |
!a | a.not() |
a == b | a.equals(b)=0 |
a > b | a.equals(b) > 0 |
a < b | a.equals(b) < 0 |
a >= b | a.compareTo(b) >= 0 |
a <= b | a.compareTo(b) <= 0 |
a..b | a.rangeTo(b) |