Kotlin一步一步學(xué)(四) -- 擴展函數(shù)和運算符

上一篇: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)。

\color{red}{PS:}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)

下一篇:Kotlin: 一步一步學(xué)(五) -- 高階函數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末皆愉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子艇抠,更是在濱河造成了極大的恐慌幕庐,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件家淤,死亡現(xiàn)場離奇詭異异剥,居然都是意外死亡,警方通過查閱死者的電腦和手機絮重,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門冤寿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人青伤,你說我怎么就攤上這事疚沐。” “怎么了潮模?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長痴施。 經(jīng)常有香客問我擎厢,道長,這世上最難降的妖魔是什么辣吃? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任动遭,我火速辦了婚禮,結(jié)果婚禮上神得,老公的妹妹穿的比我還像新娘厘惦。我一直安慰自己,他們只是感情好哩簿,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布宵蕉。 她就那樣靜靜地躺著酝静,像睡著了一般。 火紅的嫁衣襯著肌膚如雪羡玛。 梳的紋絲不亂的頭發(fā)上别智,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音稼稿,去河邊找鬼薄榛。 笑死,一個胖子當(dāng)著我的面吹牛让歼,可吹牛的內(nèi)容都是我干的敞恋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼谋右,長吁一口氣:“原來是場噩夢啊……” “哼硬猫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起倚评,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤浦徊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后天梧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盔性,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年呢岗,在試婚紗的時候發(fā)現(xiàn)自己被綠了冕香。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡后豫,死狀恐怖悉尾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挫酿,我是刑警寧澤构眯,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站早龟,受9級特大地震影響惫霸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜葱弟,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一壹店、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芝加,春花似錦硅卢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脉顿。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悦析。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留汉柒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓责鳍,卻偏偏與公主長得像碾褂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子历葛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

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