Kotlin知識(shí)歸納(二) —— 讓函數(shù)更好調(diào)用

函數(shù)參數(shù)之惑

????????當(dāng)一個(gè)函數(shù)擁有多個(gè)參數(shù),且存在多個(gè)相同類型參數(shù)緊挨著的情況時(shí)剧包,往往不太清楚傳入?yún)?shù)的位置是否正確娄琉,且嚴(yán)重影響函數(shù)的可讀性。需要調(diào)用者跳轉(zhuǎn)到函數(shù)對(duì)應(yīng)的地方恒界,對(duì)參數(shù)和函數(shù)定義中的參數(shù)列表進(jìn)行匹對(duì)睦刃。這將對(duì)函數(shù)調(diào)用者造成很大的麻煩和困擾。

fun <T> joinToString(collection: Collection<T>,
                     separator:String,
                     prefix:String,
                     postfix:String):String{
    val result = StringBuilder(prefix)
    for ((index,element) in collection.withIndex()){
        if (index > 0)
            result.append(separator)
        result.append(element)
    }
    result.append(postfix)
    return result.toString()
}

????????針對(duì)這種情況十酣,或許可以依靠IDE進(jìn)行優(yōu)化涩拙。如:Idea早已對(duì)此進(jìn)行了優(yōu)化,在對(duì)函數(shù)填寫參數(shù)時(shí)耸采,會(huì)將參數(shù)對(duì)應(yīng)位置的參數(shù)名稱進(jìn)行提示兴泥。

image

命名參數(shù)

????????Kotlin在語法層上對(duì)該情況進(jìn)行優(yōu)化,當(dāng)調(diào)用一個(gè)Kotlin定義的函數(shù)時(shí)虾宇,可以顯式標(biāo)明參數(shù)的名稱搓彻。這種參數(shù)叫命名參數(shù)。

當(dāng)指明一個(gè)參數(shù)的名稱后嘱朽,避免混淆旭贬,其他參數(shù)都要標(biāo)明名稱。(既然顯示的標(biāo)明名稱搪泳,也就不需要按原本參數(shù)定義的順序傳入?yún)?shù))

joinToString(array,prefix = "(",separator = ",", postfix = "]")

注意:

  • 既然顯示的標(biāo)明了參數(shù)名稀轨,也就意味著當(dāng)參數(shù)名或方法名進(jìn)行改變時(shí),其標(biāo)明的參數(shù)名或方法名也需要進(jìn)行改變岸军。這時(shí)可以使用Idea的Rename進(jìn)行修改奋刽。(先選中方法名或參數(shù)名 -> Refactor -> Rename)


    image
  • 當(dāng)調(diào)用Java定義的函數(shù)時(shí),不能采用命名參數(shù)艰赞,因?yàn)镴ava8之前不能把參數(shù)名存在,class文件中佣谐。而Kotlin需要與Java6兼容。所以方妖,編譯器不能識(shí)別出函數(shù)參數(shù)的名稱狭魂。

函數(shù)重載之禍

????????在Java中,支持對(duì)函數(shù)進(jìn)行重載党觅。這就造成多個(gè)相同名稱的函數(shù)雌澄,且其參數(shù)間只有細(xì)微的差別。當(dāng)調(diào)用省略部分參數(shù)的函數(shù)時(shí)仔役,可能不清楚到底調(diào)用的是哪一個(gè)函數(shù)掷伙。(例如:Thread類擁有8個(gè)構(gòu)造函數(shù))

默認(rèn)參數(shù)

????????而Kotlin只需要指定參數(shù)的默認(rèn)值,就可以有效避免創(chuàng)建多個(gè)重載函數(shù)又兵。這種帶有默認(rèn)值的函數(shù)參數(shù)叫做默認(rèn)參數(shù)随闺。再配合命名參數(shù)進(jìn)行使用時(shí),可以很方便的對(duì)指定參數(shù)進(jìn)行賦值多律,從而實(shí)現(xiàn)重載刑巧。

fun <T> joinToString(collection: Collection<T>,
                          separator:String = ",",
                          prefix:String = "",
                          postfix:String = ""):String

調(diào)用時(shí)只需要傳入具體的集合對(duì)象,函數(shù)會(huì)使用默認(rèn)參數(shù)的默認(rèn)值對(duì)其進(jìn)行運(yùn)算逆皮。

當(dāng)然宅粥,按參數(shù)定義的順序,傳入對(duì)應(yīng)的參數(shù)也完全沒有問題电谣。

val string = joinToString(array)
//像以前傳遞前綴秽梅,分割符和后綴也沒有問題
val string = joinToString(array,"(",",")
val string = joinToString(array,"(",",", "]")
//配合命名參數(shù)食用抹蚀,效果更佳
val string = joinToString(array,separator = ";")

@JvmOverloads 提高Kotlin與Java的交互性

????????Java 中沒有默認(rèn)參數(shù)的概念,當(dāng)從Java中調(diào)用Kotlin的函數(shù)時(shí)企垦,必須顯示地傳遞所有參數(shù)值环壤。為了讓Java調(diào)用者能調(diào)用該方法的重載函數(shù),可以用@JvmOverloads注解它钞诡。在編譯時(shí)郑现,編譯器會(huì)從最后一個(gè)參數(shù)開始逐個(gè)省略,生成Java的重載函數(shù)荧降。

image

參考文獻(xiàn):

android Kotlin系列:

Kotlin知識(shí)歸納(一) —— 基礎(chǔ)語法

Kotlin知識(shí)歸納(二) —— 讓函數(shù)更好調(diào)用

Kotlin知識(shí)歸納(三) —— 頂層成員與擴(kuò)展

Kotlin知識(shí)歸納(四) —— 接口和類

Kotlin知識(shí)歸納(五) —— Lambda

Kotlin知識(shí)歸納(六) —— 類型系統(tǒng)

Kotlin知識(shí)歸納(七) —— 集合

Kotlin知識(shí)歸納(八) —— 序列

Kotlin知識(shí)歸納(九) —— 約定

Kotlin知識(shí)歸納(十) —— 委托

Kotlin知識(shí)歸納(十一) —— 高階函數(shù)

Kotlin知識(shí)歸納(十二) —— 泛型

Kotlin知識(shí)歸納(十三) —— 注解

Kotlin知識(shí)歸納(十四) —— 反射

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末接箫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子朵诫,更是在濱河造成了極大的恐慌辛友,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拗窃,死亡現(xiàn)場(chǎng)離奇詭異瞎领,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)随夸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門九默,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宾毒,你說我怎么就攤上這事驼修。” “怎么了诈铛?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵乙各,是天一觀的道長。 經(jīng)常有香客問我幢竹,道長耳峦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任焕毫,我火速辦了婚禮蹲坷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘邑飒。我一直安慰自己循签,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布疙咸。 她就那樣靜靜地躺著县匠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乞旦,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天贼穆,我揣著相機(jī)與錄音,去河邊找鬼杆查。 笑死扮惦,一個(gè)胖子當(dāng)著我的面吹牛臀蛛,可吹牛的內(nèi)容都是我干的亲桦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼浊仆,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼客峭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抡柿,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤舔琅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后洲劣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體备蚓,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年囱稽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了郊尝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡战惊,死狀恐怖流昏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吞获,我是刑警寧澤况凉,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站各拷,受9級(jí)特大地震影響刁绒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烤黍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一知市、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚊荣,春花似錦初狰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春腥光,著一層夾襖步出監(jiān)牢的瞬間关顷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工武福, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留议双,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓捉片,卻偏偏與公主長得像平痰,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子伍纫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355