Kotlin一步一步學(xué)(二) -- 標(biāo)準(zhǔn)函數(shù)和靜態(tài)方法

上一篇:Kotlin一步一步學(xué)(一) -- 基礎(chǔ)快速入門(mén)

標(biāo)準(zhǔn)函數(shù)

Kotlin的標(biāo)準(zhǔn)函數(shù)指的是Standard.kt中定義的函數(shù)刽宪,任何Kotlin代碼都可以自由地調(diào)用所有的標(biāo)準(zhǔn)函數(shù)匾委。
這里我只介紹常用的4個(gè)標(biāo)準(zhǔn)函數(shù):let,with,run,apply函數(shù)。其他用到的時(shí)候請(qǐng)自行Google个束,不過(guò)其實(shí)也沒(méi)幾個(gè)了海诲。

let函數(shù)

在let函數(shù)塊內(nèi)通過(guò) it 指代調(diào)用的對(duì)象渣叛,返回值為函數(shù)塊的最后一行或指定return表達(dá)式哟玷。

一般寫(xiě)法

fun main() {
    val text = "Kotlin 大法好"
    println(text.length)
    val result = "你說(shuō)的對(duì)蕊蝗!"
    println(result)
}

let函數(shù)寫(xiě)法

fun main() {
    val result = "Kotlin 大法好".let {
        println(it.length)  //it 代表的是字符串“Kotlin 大法好”
        "你說(shuō)的對(duì)仅乓!" //最后一行,字符串“你說(shuō)的對(duì)匿又!”作為返回值返回了方灾。
    }
    println(result)  //輸出結(jié)果是“你說(shuō)的對(duì)!”
}

\color{red}{PS:}經(jīng)常用let函數(shù)對(duì)一個(gè)可null的對(duì)象的一段代碼做統(tǒng)一判空處理。

with函數(shù)

with函數(shù)不是以擴(kuò)展函數(shù)的形式存在裕偿,它是將某對(duì)象作為函數(shù)的參數(shù)傳入洞慎。在函數(shù)塊內(nèi)通過(guò) this 指代該傳入的對(duì)象,返回值為函數(shù)塊的最后一行或指定return表達(dá)式嘿棘。

一般寫(xiě)法

fun main() {
    var language = Language("Kotlin", 1)
    println(language.name + language.rank)
    var result = 100
    println(result)
}

with寫(xiě)法

fun main() {
    var result = with(Language("Kotlin", 1)) {
        println(name + rank)   //直接調(diào)用Language對(duì)象的屬性劲腿,不需要在屬性前帶對(duì)象名
        100  //最后一行,100作為返回值返回了鸟妙。
    }
    println(result)   //輸出結(jié)果是100
}

run函數(shù)

run函數(shù)的用法和使用場(chǎng)景跟with函數(shù)非常類(lèi)似焦人,只不過(guò)run函數(shù)不能直接調(diào)用,而是要調(diào)用某個(gè)對(duì)象的run函數(shù)才行重父。run函數(shù)只接受一個(gè)Lamnda參數(shù)花椭,并且會(huì)在Lambda表達(dá)式中提供調(diào)用對(duì)象的上下文,返回值為函數(shù)塊的最后一行或指定return表達(dá)式房午。

一般寫(xiě)法

fun main() {
    var language = Language("Kotlin", 1)
    println(language.name + language.rank)
    var result = 100
    println(result)
}

run寫(xiě)法

fun main() {
    var result = Language("Kotlin", 1).run {
        println(name + rank)   //直接調(diào)用Language對(duì)象的屬性矿辽,不需要在屬性前帶對(duì)象名
        100  //最后一行坯苹,100作為返回值返回了喊积。
    }
    println(result)   //輸出結(jié)果是100
}

\color{red}{PS:}run函數(shù)是let,with兩個(gè)函數(shù)的結(jié)合體米母。它彌補(bǔ)了let函數(shù)在函數(shù)體內(nèi)必須用it參數(shù)替代對(duì)象撩穿,其可以像with函數(shù)一樣省略對(duì)象歧斟,直接調(diào)用對(duì)象的屬性和方法蚣抗;它也彌補(bǔ)了with函數(shù)傳入?yún)?shù)無(wú)法判空的問(wèn)題锉走。

apply函數(shù)

apply函數(shù)從結(jié)構(gòu)上跟run函數(shù)很像吩谦,不同的是它們的返回值不同扇售。run函數(shù)跟let前塔、with函數(shù)都是返回最后一行代碼的值;而apply函數(shù)返回的則是傳入對(duì)象的本身缘眶。

一般寫(xiě)法

fun main() {
    var language = Language("Kotlin", 1)
    println(language.name + language.rank)
    var result = 100
    println(result)
}

apply寫(xiě)法

fun main() {
    var result = Language("Kotlin", 1).apply {
        println(name + rank)   //直接調(diào)用Language對(duì)象的屬性嘱根,不需要在屬性前帶對(duì)象名
        100 
    }
    println(result)   //輸出結(jié)果是Language對(duì)象本身
}

\color{red}{PS:}apply一般用于對(duì)某一對(duì)象進(jìn)行初始化賦值,然后返回該對(duì)象巷懈。

總結(jié)

平時(shí)用的比較多的是run函數(shù)和apply函數(shù)该抒。當(dāng)需要對(duì)傳入對(duì)象進(jìn)行判空,并返回特定值時(shí)顶燕,采用run函數(shù)凑保。當(dāng)需要對(duì)傳入對(duì)象進(jìn)行判定和初始化參數(shù),并返回傳入的對(duì)象時(shí)涌攻,采用apply函數(shù)欧引。


靜態(tài)方法

靜態(tài)方法在某些編程語(yǔ)言里面又叫做類(lèi)方法,指的就是那種不需要?jiǎng)?chuàng)建實(shí)例就能調(diào)用的方法恳谎。一般不需要依賴(lài)其它類(lèi)或資源時(shí)芝此,就可以用靜態(tài)方法憋肖,這時(shí)就是一個(gè)面向過(guò)程的函數(shù)而已。

Java的寫(xiě)法

在Java中定義靜態(tài)方法非常簡(jiǎn)單婚苹,只需要在方法上聲明一個(gè)static關(guān)鍵字就可以了岸更,如下所示

public class Util {
        public static void doSomething( ) {
               System.out.println("do something");
         }
}

Kotlin的寫(xiě)法

Kotlin中沒(méi)有直接定義靜態(tài)方法的關(guān)鍵字,需要使用伴生對(duì)象companion object來(lái)實(shí)現(xiàn)類(lèi)似的效果膊升,如下所示

class Util { 
       companion object { 
              fun doSomething ( ){
                    println ("do something")
              }
       }
}

不過(guò)doSomething( )方法實(shí)際并不是靜態(tài)方法怎炊,companion object這個(gè)關(guān)鍵字實(shí)際上會(huì)在Util類(lèi)的內(nèi)部創(chuàng)建一個(gè)伴生類(lèi),而doSomething( )方法就是定義在這個(gè)伴生類(lèi)里面的實(shí)例方法廓译。只是Kotlin會(huì)保證Util類(lèi)時(shí)鐘只會(huì)存在一個(gè)伴生類(lèi)對(duì)象评肆,因此調(diào)用Util.doSomething( )方法實(shí)際上市調(diào)用了Util類(lèi)中伴生對(duì)象的doSomething( )方法。

如果你確確實(shí)實(shí)需要定義真正的靜態(tài)方法非区,讓你在Java代碼中以靜態(tài)方法的形式去調(diào)用的話瓜挽,Kotlin仍然提供了兩種實(shí)現(xiàn)方式:注解和頂層方法。
在單例類(lèi)或companion object中的方法加上@JvmStatic注解征绸,那么Kotlin編譯器就會(huì)將這些方法編譯成真正的靜態(tài)方法秸抚,如下所示

class Util { 
       companion object { 
              @JvmStatic
              fun doSomething ( ){
                    println ("do something")
              }
       }
}

下一篇:Kotlin一步一步學(xué)(三) -- 延遲初始化和密封類(lèi)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市歹垫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颠放,老刑警劉巖排惨,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異碰凶,居然都是意外死亡暮芭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)欲低,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)辕宏,“玉大人,你說(shuō)我怎么就攤上這事砾莱∪鹂穑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵腊瑟,是天一觀的道長(zhǎng)聚假。 經(jīng)常有香客問(wèn)我,道長(zhǎng)闰非,這世上最難降的妖魔是什么膘格? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮财松,結(jié)果婚禮上瘪贱,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好菜秦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布甜害。 她就那樣靜靜地躺著,像睡著了一般喷户。 火紅的嫁衣襯著肌膚如雪唾那。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天褪尝,我揣著相機(jī)與錄音闹获,去河邊找鬼。 笑死河哑,一個(gè)胖子當(dāng)著我的面吹牛避诽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播璃谨,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼沙庐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了佳吞?” 一聲冷哼從身側(cè)響起拱雏,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎底扳,沒(méi)想到半個(gè)月后铸抑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衷模,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年鹊汛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阱冶。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刁憋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出木蹬,到底是詐尸還是另有隱情至耻,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布镊叁,位于F島的核電站有梆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏意系。R本人自食惡果不足惜泥耀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛔添。 院中可真熱鬧痰催,春花似錦兜辞、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至缝裁,卻和暖如春扫皱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捷绑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工韩脑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粹污。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓段多,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親壮吩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子进苍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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

  • 目錄: 一、回調(diào)函數(shù)的Kotin的lambda的簡(jiǎn)化二市俊、內(nèi)聯(lián)擴(kuò)展函數(shù)之let三杨凑、內(nèi)聯(lián)函數(shù)之with四、內(nèi)聯(lián)擴(kuò)展函數(shù)...
    KtYY閱讀 606評(píng)論 0 8
  • 1. 簡(jiǎn)介 Java代碼編譯后生成的并不是計(jì)算機(jī)可以識(shí)別的二進(jìn)制語(yǔ)言摆昧,而是特殊的class文件撩满,這種class文件...
    MCCorleone閱讀 818評(píng)論 0 0
  • 一、快速入門(mén) Kotlin 編程 1.變量和函數(shù) 變量 在 Kotlin 中定義一個(gè)變量绅你,只允許在變量前聲明兩種關(guān)...
    TomyZhang閱讀 348評(píng)論 0 0
  • 一伺帘、前言- 1.為什么要學(xué)kotlin?- 2.準(zhǔn)備工作 二忌锯、kotlin基礎(chǔ)語(yǔ)法- 2伪嫁、函數(shù)- 3、條件控制- ...
    會(huì)思考的鴨子閱讀 2,885評(píng)論 7 36
  • kotlin 用了這么久也一直沒(méi)有整理過(guò),當(dāng)想整理的時(shí)候又不知道又不知道該整理點(diǎn)啥,于是就從項(xiàng)目中用到最多的整理記...
    葛糖糖閱讀 2,415評(píng)論 1 3