操作符重載
Kotin有一些固定數(shù)量象征性的操作符,我們可以在任何類中很容易地使用它們。方法是創(chuàng)建一個(gè)方法,方法名為保留的操作符關(guān)鍵字,這樣就可以讓這個(gè)操作符的行為映射到這個(gè)方法。重載這些操作符可以增加代碼可讀性和簡潔性。
操作符表
這里你可以看見一系列包括操作符和對(duì)應(yīng)方法的表。對(duì)應(yīng)方法必須在指定的類中通過各種可能性被實(shí)現(xiàn)。
一元操作符
| 操作符 | 函數(shù) |
|---|---|
| +a | a.unaryPlus() |
| -a | a.unaryMinus() |
| !a | a.not() |
| a++ | a.inc() |
| a-- | a.dec() |
二元操作符
| 操作符 | 函數(shù) |
|---|---|
| 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) |
數(shù)組操作符
| 操作符 | 函數(shù) |
|---|---|
| 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) |
等于操作符
| 操作符 | 函數(shù) |
|---|---|
| a == b | a?.equals(b) ?: b === null |
| a != b | !(a?.equals(b) ?: b === null) |
相等操作符有一點(diǎn)不同,為了達(dá)到正確合適的相等檢查做了更復(fù)雜的轉(zhuǎn)換,因?yàn)橐玫揭粋€(gè)確切的函數(shù)結(jié)構(gòu)比較,不僅僅是指定的名稱。方法必須要如下準(zhǔn)確地被實(shí)現(xiàn):
operator fun equals(other: Any?): Boolean
操作符===和!==用來做身份檢查(它們分別是Java中的==和!=),并且它們不能被重載。
函數(shù)調(diào)用
| 方法 | 調(diào)用 |
|---|---|
| a(i) | a.invoke(i) |
| a(i, j) | a.invoke(i, j) |
| a(i_1, ..., i_n) | a.invoke(i_1, ..., i_n) |
例子
你可以想象,Kotlin List是實(shí)現(xiàn)了數(shù)組操作符的,所以我們可以像Java中的數(shù)組一樣訪問List的每一項(xiàng)。除此之外:在可修改的List中,每一項(xiàng)也可以用一個(gè)簡單的方式被直接設(shè)置:
val x = myList[2]
myList[2] = 4
如果你還記得,我們有一個(gè)叫ForecastList的數(shù)據(jù)類,它是由很多其他額外的信息組成的。有趣的是可以直接訪問它的每一項(xiàng)而不是請(qǐng)求內(nèi)部的list得到某一項(xiàng)。做一個(gè)完全不相關(guān)的事情,我要去實(shí)現(xiàn)一個(gè)size()方法,它能稍微能簡化一點(diǎn)當(dāng)前的Adapter:
data class ForecastList(val city: String, val country: String,
val dailyForecast: List<Forecast>) {
operator fun get(position: Int): Forecast = dailyForecast[position]
fun size(): Int = dailyForecast.size
}
它會(huì)使我們的onBindViewHolder更簡單一點(diǎn):
override fun onBindViewHolder(holder: ViewHolder,
position: Int) {
with(weekForecast[position]) {
holder.textView.text = "$date - $description - $high/$low"
}
}
當(dāng)然還有getItemCount()方法:
override fun getItemCount(): Int = weekForecast.size()
擴(kuò)展函數(shù)中的操作符
我們不需要去擴(kuò)展我們自己的類,但是我需要去使用擴(kuò)展函數(shù)擴(kuò)展我們已經(jīng)存在的類來讓第三方的庫能提供更多的操作。幾個(gè)例子,我們可以去像訪問List的方式去訪問ViewGroup的view:
operator fun ViewGroup.get(position: Int): View = getChildAt(position)
現(xiàn)在真的可以非常簡單地從一個(gè)ViewGroup中通過position得到一個(gè)view:
val container: ViewGroup = find(R.id.container)
val view = container[2]
別忘了去Kotlin for Android developers repository去查看這些代碼。