Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-函數(shù)-基礎(chǔ)語法(六)

本人也是在初學(xué)Kotlin,如有錯(cuò)誤,請(qǐng)幫忙指出,持續(xù)更新

Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-函數(shù)-基礎(chǔ)語法(六)

建議先看看前面的文章
Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-基礎(chǔ)語法(一)

Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-基本類型-基礎(chǔ)語法(二)

Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-包-控制流-返回與跳轉(zhuǎn)-基礎(chǔ)語法(三)

Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-類和對(duì)象-基礎(chǔ)語法(四)

Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-類和對(duì)象(下)-基礎(chǔ)語法(五)

這篇文章分享的內(nèi)容比較多,建議先關(guān)注收藏,再查看矗积,以免迷路
函數(shù)
函數(shù)聲明

在 kotlin 中用關(guān)鍵字 fun 聲明函數(shù):

fun double(x: Int): Int { }
函數(shù)用法

通過傳統(tǒng)的方法調(diào)用函數(shù)

val result = double(2)

通過 . 調(diào)用成員函數(shù)

Sample().foo() // 創(chuàng)建Sample類的實(shí)例,調(diào)用foo方法
參數(shù)

函數(shù)參數(shù)是用 Pascal 符號(hào)定義的 name:type。參數(shù)之間用逗號(hào)隔開盅抚,每個(gè)參數(shù)必 須指明類型漠魏。

fun powerOf(number: Int, exponent: Int) { ... }
默認(rèn)參數(shù)

函數(shù)參數(shù)可以設(shè)置默認(rèn)值,當(dāng)參數(shù)被忽略時(shí)會(huì)使用默認(rèn)值。這樣相比其他語言可以減 少重載妄均。

fun read(b: Array<Byte>, off: Int = 0, len: Int = b.size() ) { ... }

默認(rèn)值可以通過在type類型后使用 = 號(hào)進(jìn)行賦值

命名參數(shù)
fun reformat(str: String, normalizeCase: Boolean = true,
upperCas eFirstLetter: Boolean = true, divideByCamelHumps: Boolean = false,
 wordSeparator: Char = ' ') { ... }

以使用默認(rèn)參數(shù)

reformat(str)

然而當(dāng)調(diào)用非默認(rèn)參數(shù)是就需要像下面這樣:

reformat(str, true, true, false, '_')

使用命名參數(shù)我們可以讓代碼可讀性更強(qiáng):

reformat(str, 
    normalizeCase = true, 
    uppercaseFirstLetter = true, 
    divideByCamelHumps = false, 
    wordSeparator = '_' 
)

如果不需要全部參數(shù)的話可以這樣:

reformat(str, wordSeparator = '_')
不帶返回值的參數(shù)

如果函數(shù)不會(huì)返回任何有用值柱锹,那么他的返回類型就是 Unit . Unit 是一個(gè)只 有唯一值 Unit 的類型.這個(gè)值并不需要被直接返回,可以省略不寫丰包,和java的void一樣

fun printHello(name: String?): Unit {}
fun printHello(name: String?) {}  //省略

單表達(dá)式函數(shù)
當(dāng)函數(shù)只返回單個(gè)表達(dá)式時(shí)禁熏,大括號(hào)可以省略并在 = 后面定義函數(shù)體

fun double(x: Int): Int = x*2
fun double(x: Int) = x * 2
變長參數(shù)

函數(shù)的參數(shù)(通常是最后一個(gè)參數(shù))可以用 vararg 修飾符進(jìn)行標(biāo)記:

fun asList<T>(vararg ts: T): List<T> { 
    val result = ArrayList<T>() 
    for (t in ts) 
        result.add(t) 
    return result 
}

val list = asList(1, 2, 3)

當(dāng)調(diào)用變長參數(shù)的函數(shù)時(shí),我們可以一個(gè)一個(gè)的傳遞參數(shù)邑彪,比如 asList(1, 2, 3) 瞧毙,或者我們要傳遞一個(gè) array 的內(nèi)容給函數(shù),我們就可以使用 * 前綴操作符:

val a = array(1, 2, 3) 
val list = asList(-1, 0, *a, 4)

函數(shù)范圍

Kotlin 中可以在文件頂級(jí)聲明函數(shù)寄症,這就意味者你不用像在Java,C#或是Scala一樣 創(chuàng)建一個(gè)類來持有函數(shù)宙彪。除了頂級(jí)函數(shù),Kotlin 函數(shù)可以聲明為局部的有巧,作為成員 函數(shù)或擴(kuò)展函數(shù)释漆。

局部函數(shù)

Kotlin 支持局部函數(shù),比如在一個(gè)函數(shù)包含另一函數(shù)篮迎。
局部函數(shù)可以訪問外部函數(shù)的局部變量(比如閉包)
局部函數(shù)甚至可以返回到外部函數(shù)

成員函數(shù)

成員函數(shù)是定義在一個(gè)類或?qū)ο罄镞叺?/p>

class Sample() { 
    fun foo() { 
        print("Foo") 
    } 
}

成員函數(shù)可以用 . 的方式調(diào)用 Sample.foo()

泛型函數(shù)

函數(shù)可以有泛型參數(shù)男图,樣式是在函數(shù)后跟上尖括號(hào)示姿。

fun sigletonArray<T>(item: T): Array<T> { 
    return Array<T>(1, {item}) 
}
尾遞歸函數(shù)

Kotlin 支持函數(shù)式編程的尾遞歸。這個(gè)允許一些算法可以通過循環(huán)而不是遞歸解決 問題逊笆,從而避免了棧溢出栈戳。當(dāng)函數(shù)被標(biāo)記為 tailrec 時(shí),編譯器會(huì)優(yōu)化遞歸难裆,并 用高效迅速的循環(huán)代替它子檀。

tailrec fun findFixPoint(x: Double = 1.0): Double 
= if (x == Math.cos(x)) x 
else findFixPoint(Math.cos(x))

這段代碼計(jì)算的是數(shù)學(xué)上的余弦不動(dòng)點(diǎn)。Math.cos 從 1.0 開始不斷重復(fù)差牛,直到值不 變?yōu)橹姑Y(jié)果是 0.7390851332151607 這段代碼和下面的是等效的:

private fun findFixPoint(): Double {    
    var x = 1.0 
    while (true) { 
        val y = Math.cos(x) 
        if ( x == y ) 
        return y 
        x = y 
    } 
}

使用 tailrec 修飾符必須在最后一個(gè)操作中調(diào)用自己堰乔。在遞歸調(diào)用代碼后面是不 允許有其它代碼的偏化,并且也不可以在 try/catch/finall 塊中進(jìn)行使用。當(dāng)前的尾遞歸 只在 JVM 的后端中可以用.

這篇文章主要分享Kotlin中的函數(shù).

本人也是在初學(xué)Kotlin镐侯,如有錯(cuò)誤侦讨,請(qǐng)幫忙指出,持續(xù)更新

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末苟翻,一起剝皮案震驚了整個(gè)濱河市韵卤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌崇猫,老刑警劉巖沈条,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诅炉,居然都是意外死亡蜡歹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門涕烧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來月而,“玉大人,你說我怎么就攤上這事议纯「缚睿” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵瞻凤,是天一觀的道長憨攒。 經(jīng)常有香客問我,道長阀参,這世上最難降的妖魔是什么肝集? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮结笨,結(jié)果婚禮上包晰,老公的妹妹穿的比我還像新娘湿镀。我一直安慰自己,他們只是感情好伐憾,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布勉痴。 她就那樣靜靜地躺著,像睡著了一般树肃。 火紅的嫁衣襯著肌膚如雪蒸矛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天胸嘴,我揣著相機(jī)與錄音雏掠,去河邊找鬼。 笑死劣像,一個(gè)胖子當(dāng)著我的面吹牛乡话,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耳奕,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼绑青,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了屋群?” 一聲冷哼從身側(cè)響起闸婴,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芍躏,沒想到半個(gè)月后邪乍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡对竣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年庇楞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柏肪。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姐刁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烦味,到底是詐尸還是另有隱情聂使,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布谬俄,位于F島的核電站柏靶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏溃论。R本人自食惡果不足惜屎蜓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钥勋。 院中可真熱鬧炬转,春花似錦辆苔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荐吵,卻和暖如春骑冗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背先煎。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工贼涩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人薯蝎。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓遥倦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親良风。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谊迄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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