Kotlin之操作符重載

操作符重載

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去查看這些代碼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,038評(píng)論 0 2
  • 參考: kotlin in action kotlin 官方參考文檔 運(yùn)算符重載 Kotlin允許我們?yōu)樽约旱念愋?..
    zhaoyubetter閱讀 5,973評(píng)論 0 5
  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 10,550評(píng)論 0 13
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,246評(píng)論 0 38
  • 放寒假了,可運(yùn)動(dòng)不能停。 所以,我和同學(xué)約好一起去跑步,我們?cè)缟?點(diǎn)集合,跑完正好去補(bǔ)習(xí)班。 我們兩個(gè)就在小區(qū)里瘋...
    流蘇安然閱讀 166評(píng)論 0 3

友情鏈接更多精彩內(nèi)容