Kotlin快速入門(二)——運(yùn)算符和表達(dá)式

運(yùn)算符和表達(dá)式

Kotlin基本支持Java的全部運(yùn)算符(可能有些種子語(yǔ)法上存在差異)境输,Kotlin不支持三目運(yùn)算符梨撞。

1. 與Java相同的運(yùn)算符

Kotlin的運(yùn)算符都是以方法形式實(shí)現(xiàn)的,這些運(yùn)算符都具有特定的符號(hào)和固定的優(yōu)先級(jí)挤渔。

  1. 單目前綴運(yùn)算符

    運(yùn)算符 對(duì)應(yīng)的方法
    +a a.unaryPlus()
    -a a.unaryMinus()
    !a a.not
    fun main(args: Array<String>) {
    
        val a = 20
        val b = -a
        val c = a.unaryMinus()
        println("b: $b, c: $c") // b: -20, c: -20
    
        val flag = true
        val f1 = !flag
        val f2 = flag.not()
        println("f1: $f1, f2: $f2") // f1: false, f2: false
    }
    

    如果在API中發(fā)現(xiàn)某個(gè)類有unaryPlus()窗市、unaryMinus()先慷、not()方法,那就說(shuō)明可對(duì)該類的實(shí)例使用單目前綴運(yùn)算符+咨察、-论熙、!進(jìn)行運(yùn)算。

  2. 自加和自減運(yùn)算符

    運(yùn)算符 對(duì)應(yīng)的方法
    a++ a.inc()
    a-- a.dec()

    如果在API中發(fā)現(xiàn)某個(gè)類有inc()摄狱、dec()方法脓诡,那就說(shuō)明可對(duì)該類的實(shí)例使用++--進(jìn)行運(yùn)算媒役。

  3. 雙目算術(shù)運(yùn)算符

    運(yùn)算符 對(duì)應(yīng)的方法
    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..b a.rangeTo(b)

    如果在API中發(fā)現(xiàn)某個(gè)類有一個(gè)帶參數(shù)的plus()祝谚、minus()times()酣衷、div()踊跟、rem()rangeTo()方法鸥诽,那就說(shuō)明可對(duì)該類的實(shí)例使用以上雙目算術(shù)運(yùn)算符商玫。

  4. in和!in運(yùn)算符

    運(yùn)算符 對(duì)應(yīng)的方法
    a in b b.contains(a)
    a !in b !b.contains(a)
    fun main(args: Array<String>) {
    
        val str = "JamFF"
        println(str.contains("java"))
        println("java" in str)
    
        val arr = arrayOf(8, 32, 94, 53, 10)
        println(arr.contains(53))
        println(53 in arr)
    }
    

    如果在API中發(fā)現(xiàn)某個(gè)類有一個(gè)帶參數(shù)contains()方法,那就說(shuō)明可對(duì)該類的實(shí)例使用in牡借、!in運(yùn)算符拳昌。

  5. 索引訪問(wèn)運(yùn)算符

    運(yùn)算符 對(duì)應(yīng)的方法
    a[i] a.get(i)
    a[i, j] a.get(i, j)
    a[i_l, ..., i_n] a.get(i_l, ..., i_n)
    a[i]=b a.set(i ,b)
    a[i, j]=b a.set(i, j, b)
    a[i_l,...,i_n]=b a.set(i_l ,..., i_n)
  6. 調(diào)用運(yùn)算符

    運(yùn)算符 對(duì)應(yīng)的方法
    a() a.invoke()
    a(b) a.invoke(b)
    a(b1, b2) a.invoke(b1, b2)
    a(b1, b2, b3, ...) a.invoke(b1, b2, b3, ...)
    fun main(args: Array<String>) {
    
        val s = "java.lang.String"
        val mtd = Class.forName(s).getMethod("length")
        // 使用傳統(tǒng)方法,使用Method對(duì)象的invoke方法
        println(mtd.invoke("java")) // 輸出4
        // 使用調(diào)用運(yùn)算符
        println(mtd("java")) // 輸出4
    }
    
  7. 廣義賦值運(yùn)算符

    運(yùn)算符 對(duì)應(yīng)的方法
    a += b a.plusAssign(b)
    a -= b a.minusAssign(b)
    a *= b a.timesAssign(b)
    a /= b a.divAssign(b)
    a %= b a.remAssign(b)
  8. 相等于不等運(yùn)算符

    運(yùn)算符 對(duì)應(yīng)的方法
    a == b a?.equals(b):(b===null)
    a != b !(a?.equals(b)?:(b===null))

    Kotlin中==equals本質(zhì)是一樣的钠龙,只不過(guò)==避免了空指針炬藤;而Java中比較對(duì)象的==!=在Kotlin中由===!==代替。

  9. 比較運(yùn)算符

    運(yùn)算符 對(duì)應(yīng)的方法
    a > b a.compareTo(b) > 0
    a < b a.compareTo(b) < 0
    a >= b a.compareTo(b) >= 0
    a <= b a.compareTo(b) <= 0

    如果在API中發(fā)現(xiàn)某個(gè)類實(shí)現(xiàn)了Comparable方法碴里,那就該類的實(shí)例即可使用比較運(yùn)算符來(lái)比較大小沈矿。

2. 位運(yùn)算符

Kotlin支持的位運(yùn)算符同樣有7個(gè),但是并不是特殊字符形式咬腋,而是以infix函數(shù)的形式給出的羹膳,因此只能用函數(shù)名執(zhí)行這些位運(yùn)算符。

  • and(bits):按位與根竿。
  • or(bits):按位或陵像。
  • inv(bits):按位非。
  • xor(bits):按位異或寇壳。
  • shl(bits):左移運(yùn)算符醒颖。
  • shr(bits):右移運(yùn)算符。
  • ushr(bits):無(wú)符號(hào)右移運(yùn)算符壳炎。

Kotlin的位運(yùn)算符只能對(duì)IntLong兩種數(shù)據(jù)類型起作用泞歉。

3. 區(qū)間運(yùn)算符

  1. 閉區(qū)間運(yùn)算符
    a..b定義一個(gè)從a到b(包含a和b)的所有值的區(qū)間。

    fun main(args: Array<String>) {
    
        val range = 2..6
        for (num in range) {
            print("$num ") // 輸出2 3 4 5 6
        }
    }
    
  2. 半開(kāi)區(qū)間運(yùn)算符
    a until b定義一個(gè)從a到b(包含a,不包含b)的所有值的區(qū)間腰耙。
    利用半開(kāi)區(qū)間便利數(shù)組的列表時(shí)非常方便偿洁。

    fun main(args: Array<String>) {
    
        val books = arrayOf("Swift", "Kotlin", "C", "C++")
        for (index in 0 until books.size) {
            println("第${index + 1}中語(yǔ)言是:${books[index]}")
        }
    }
    
  3. 反向區(qū)間
    如果希望區(qū)間從大到小,可以使用downTo運(yùn)算符(其實(shí)是一個(gè)infix函數(shù))沟优,該運(yùn)算符同樣是一個(gè)閉區(qū)間涕滋。

    fun main(args: Array<String>) {
    
        val range = 6 downTo 2
        for (num in range) {
            print("$num ") // 輸出6 5 4 3 2
        }
    }
    
  4. 區(qū)間步長(zhǎng)
    前面區(qū)間的默認(rèn)步長(zhǎng)都是1,可通過(guò)step運(yùn)算符(其實(shí)是一個(gè)infix函數(shù))指定區(qū)間步長(zhǎng)挠阁。

    fun main(args: Array<String>) {
    
        for (num in 7 downTo 1 step 2) {
            print("$num ") // 輸出7 5 3 1 
        }
    }
    

4. 運(yùn)算符重載

重載運(yùn)算符的方法需要運(yùn)用operator修飾符進(jìn)行標(biāo)記宾肺。

  1. 重載單目前綴運(yùn)算符

    data class Data(val x: Int, val y: Int) {
        // 為Data類定義一個(gè)unaryMinus()方法
        operator fun unaryMinus(): Data {
            return Data(-x, -y)
        }
    }
    
    // 以擴(kuò)展方法的形式為Data類定義unaryPlus()方法
    operator fun Data.unaryPlus(): Data {
        return Data(-x, -y)
    }
    
    fun main(args: Array<String>) {
    
        val d = Data(4, 10)
        println(-d)
        println(+d)
    }
    
  2. 重載自加和自減運(yùn)算符

    data class Data(val x: Int, val y: Int) {
        // 為Data類定義一個(gè)inc()方法
        operator fun inc(): Data {
            return Data(x + 1, y + 1)
        }
    }
    
    // 以擴(kuò)展方法的形式為Data類定義dec()方法
    operator fun Data.dec(): Data {
        return Data(x - 1, y - 1)
    }
    
    fun main(args: Array<String>) {
    
        var d = Data(4, 10)
        println(d++) // 輸出Data(x=4, y=10)
        println(d) // 輸出Data(x=5, y=11)
        var dd = Data(9, 20)
        println(--dd) // 輸出Data(x=8, y=19)
        println(dd) // 輸出Data(x=8, y=19)
    }
    
  3. 重載雙目算術(shù)運(yùn)算符

    data class Point(val x: Int, val y: Int) {
        // 為Point類定義一個(gè)minus()方法
        operator fun minus(target: Point): Double {
            return Math.hypot((this.x - target.x).toDouble()
                    , (this.y - target.y).toDouble())
        }
    }
    
    // 以擴(kuò)展方法的形式為Point類定義dec()方法
    operator fun Point.times(target: Point): Int {
        return Math.abs(this.x - target.x) *
                Math.abs(this.y - target.y)
    }
    
    fun main(args: Array<String>) {
    
        val p1 = Point(0, 0)
        val p2 = Point(3, 4)
        println("p1與p2的距離為:${p1 - p2}") // 輸出5
        println("p1與p2圍成的矩形面積為:${p1 * p2}") // 輸出12
    }
    

重點(diǎn)

  • in!in運(yùn)算符
  • =====運(yùn)算符
  • 位運(yùn)算符
  • 區(qū)間運(yùn)算符
  • 運(yùn)算符重載
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市侵俗,隨后出現(xiàn)的幾起案子锨用,更是在濱河造成了極大的恐慌,老刑警劉巖隘谣,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件增拥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡寻歧,警方通過(guò)查閱死者的電腦和手機(jī)掌栅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)码泛,“玉大人猾封,你說(shuō)我怎么就攤上這事≡肷海” “怎么了晌缘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)痢站。 經(jīng)常有香客問(wèn)我磷箕,道長(zhǎng),這世上最難降的妖魔是什么阵难? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任岳枷,我火速辦了婚禮,結(jié)果婚禮上多望,老公的妹妹穿的比我還像新娘嫩舟。我一直安慰自己氢烘,他們只是感情好怀偷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著播玖,像睡著了一般椎工。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天维蒙,我揣著相機(jī)與錄音掰吕,去河邊找鬼。 笑死颅痊,一個(gè)胖子當(dāng)著我的面吹牛殖熟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斑响,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼菱属,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了舰罚?” 一聲冷哼從身側(cè)響起纽门,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎营罢,沒(méi)想到半個(gè)月后赏陵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饲漾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年蝙搔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片考传。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杂瘸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伙菊,到底是詐尸還是另有隱情败玉,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布镜硕,位于F島的核電站运翼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏兴枯。R本人自食惡果不足惜血淌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望财剖。 院中可真熱鬧悠夯,春花似錦、人聲如沸躺坟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)咪橙。三九已至夕膀,卻和暖如春虚倒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背产舞。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工魂奥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人易猫。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓耻煤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親准颓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子违霞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 本文是在學(xué)習(xí)和使用kotlin時(shí)的一些總結(jié)與體會(huì),一些代碼示例來(lái)自于網(wǎng)絡(luò)或Kotlin官方文檔瞬场,持續(xù)更新... 對(duì)...
    竹塵居士閱讀 3,281評(píng)論 0 8
  • 在C語(yǔ)言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來(lái)閱讀 3,340評(píng)論 0 2
  • Scala與Java的關(guān)系 Scala與Java的關(guān)系是非常緊密的B蚋搿! 因?yàn)镾cala是基于Java虛擬機(jī)贯被,也就是...
    燈火gg閱讀 3,440評(píng)論 1 24
  • 最近公司計(jì)劃用上新的技術(shù) React Native眼五,所以就開(kāi)始學(xué)習(xí)研究。 首先搭建開(kāi)發(fā)環(huán)境 準(zhǔn)備工作 安裝 Hom...
    wanqijian閱讀 238評(píng)論 0 0
  • 昔日同歡忘憂傷彤灶,云濕門窗看幼,雨濕門窗; 而今獨(dú)自對(duì)浣江幌陕,風(fēng)在回廊诵姜,月在回廊! 齊帆齊寫(xiě)作課第六期學(xué)員第二十四篇
    花氏一族閱讀 358評(píng)論 0 1