目錄
擴展函數
語法結構
代碼示例
運算符重載
語法結構
一元操作符
二元操作符
數值類型操作符
等于和不等于操作符
比較操作符
調用操作符
擴展函數
語法結構
對于擴張函數的語法結構其實很簡單,你想在那個類中添加擴張函數,那么你就用該類的類名加上點就可以,一般語法結構如下:
fun ClassName.methodName(): Int {return 0
}
代碼示例
fun String.lettersCount(): Int {var count = 0for (letterChar in this) {if (letterChar.isLetter()) count++}return count
}
我們只需要創建一個為String.kt的文件,對于文件名我們可以隨便命名,但是最好還是創建哪個類的擴展函數就以哪個類為文件名,這樣便于查找,也方便后續的合作開發。
我們將lettersCount()
方法定義成了String
類的擴展函數,那么函數中就自動擁有了String
實例的上下文。因此lettersCount()
函數就不再需要接收一個字符串參數了,而是直接遍歷this
即可,因為現在this
就代表著字符串本身。
定義好了擴展函數之后,統計某個字符串中的字母數量只需要這樣寫即可:
val count = "dshdhakjdas2u121jksd23424h".lettersCount()println("含有$count 個字母")
除了String
類之外,你還可以向任何類中添加擴展函數,Kotlin對此基本沒有限制。
運算符重載
語法結構
class Obj{operator fun plus(obj: Obj) : Obj{//處理邏輯}
}
運算符重載使用的是operator
關鍵字,只要在指定函數的前面加上operator
關鍵字,就可以實現運算符重載的功能了。
在上述語法結構中,關鍵字operator
和函數名plus
都是固定不變的,而接收的參數和函數返回值可以根據你的邏輯自行設定。那么上述代碼就表示一個Obj
對象可以與另一個Obj
對象相加,最終返回一個新的Obj
對象。對應的調用方式如下:
val obj1 = Obj()
val obj2 = Obj()
val obj3 = obj1 + obj2
這種obj1 + obj2
的語法看上去好像很神奇,但其實這就是Kotlin給我們提供的一種語法糖,它會在編譯的時候被轉換成obj1.plus(obj2)
的調用方式。
了解了運算符重載的基本語法之后,下面我們開始實現一個更加有意義功能:讓兩個Money
對象相加。
首先定義Money
類的結構,這里我準備讓Money
的主構造函數接收一個value
參數,用于表示錢的金額。創建Money.kt文件,然后定義plus運算符重載,代碼如下所示:
class Money(val value: Int) {operator fun plus(money: Money): Money {val sum = money.value + valuereturn Money(sum)}
}
可以看到,這里使用了operator
關鍵字來修飾plus()
函數,這是必不可少的。在plus()
函數中,我們將當前Money
對象的value
和參數傳入的Money
對象的value
相加,然后將得到的和傳給一個新的Money
對象并將該對象返回。這樣兩個Money
對象就可以相加了,就是這么簡單。除了plus()函數,Kotlin還提供了很多,如下:
一元操作符
操作符 | 方法名 |
---|---|
+a | a.unaryPlus() |
-a | a.unaryMinus() |
!a | a.not() |
a++ | a.inc() |
二元操作符
操作符 | 方法名 |
---|---|
a + b | a.plus(b) |
a – b | a.minus(b) |
a * b | a.times(b) |
a / b | a.div(b) |
a % b | a.mod(b) |
a..b | a.rangeTo(b) |
a in b | b.contains(a) |
a !in b | !b.contains(a) |
a += b | a.plusAssign(b) |
a -= b | a.minusAssign(b) |
a *= b | a.timesAssign(b) |
a /= b | a.divAssign(b) |
a %= b | a.modAssign(b) |
數值類型操作符
操作符 | 方法名 |
---|---|
a[i] | a.get(i) |
a[i, j] | a.get(i, j) |
a[i_1, …, i_n] | a.get(i_1, …, i_n) |
a[i] = b | a.set(i, b) |
a[i, j] = b | a.set(i, j, b) |
a[i_1, …, i_n] = b | a.set(i_1, …, i_n, b) |
等于和不等于操作符
操作符 | 方法名 |
---|---|
a == b | a?.equals(b) ?: (b === null) |
a != b | !(a?.equals(b) ?: (b === null)) |
比較操作符
操作符 | 方法名 |
---|---|
a > b | a.compareTo(b) > 0 |
a < b | a.compareTo(b) < 0 |
a >= b | a.compareTo(b) >= 0 |
a <= b | a.compareTo(b) <= 0 |
調用操作符
操作符 | 方法名 |
---|---|
a() | a.invoke() |
a(i) | a.invoke(i) |
a(i, j) | a.invoke(i, j) |
a(i_1, …, i_n) | a.invoke(i_1, …, i_n) |