Android:Kotlin詳細入門學習指南-函數-基礎語法(六)

本人也是在初學Kotlin,如有錯誤,請幫忙指出,持續更新

Android:Kotlin詳細入門學習指南-函數-基礎語法(六)

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

Android:Kotlin詳細入門學習指南-基本類型-基礎語法(二)

Android:Kotlin詳細入門學習指南-包-控制流-返回與跳轉-基礎語法(三)

Android:Kotlin詳細入門學習指南-類和對象-基礎語法(四)

Android:Kotlin詳細入門學習指南-類和對象(下)-基礎語法(五)

這篇文章分享的內容比較多,建議先關注收藏,再查看,以免迷路
函數
函數聲明

在 kotlin 中用關鍵字 fun 聲明函數:

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

通過傳統的方法調用函數

val result = double(2)

通過 . 調用成員函數

Sample().foo() // 創建Sample類的實例,調用foo方法
參數

函數參數是用 Pascal 符號定義的 name:type。參數之間用逗號隔開,每個參數必 須指明類型。

fun powerOf(number: Int, exponent: Int) { ... }
默認參數

函數參數可以設置默認值,當參數被忽略時會使用默認值。這樣相比其他語言可以減 少重載。

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

默認值可以通過在type類型後使用 = 號進行賦值

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

以使用默認參數

reformat(str)

然而當調用非默認參數是就需要像下面這樣:

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

使用命名參數我們可以讓代碼可讀性更強:

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

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

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

如果函數不會返回任何有用值,那麼他的返回類型就是 Unit . Unit 是一個只 有唯一值 Unit 的類型.這個值並不需要被直接返回,可以省略不寫,和java的void一樣

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

單表達式函數
當函數只返回單個表達式時,大括號可以省略並在 = 後面定義函數體

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

函數的參數(通常是最後一個參數)可以用 vararg 修飾符進行標記:

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)

當調用變長參數的函數時,我們可以一個一個的傳遞參數,比如 asList(1, 2, 3) ,或者我們要傳遞一個 array 的內容給函數,我們就可以使用 * 前綴操作符:

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

函數範圍

Kotlin 中可以在文件頂級聲明函數,這就意味者你不用像在Java,C#或是Scala一樣 創建一個類來持有函數。除了頂級函數,Kotlin 函數可以聲明爲局部的,作爲成員 函數或擴展函數。

局部函數

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

成員函數

成員函數是定義在一個類或對象裏邊的

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

成員函數可以用 . 的方式調用 Sample.foo()

泛型函數

函數可以有泛型參數,樣式是在函數後跟上尖括號。

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

Kotlin 支持函數式編程的尾遞歸。這個允許一些算法可以通過循環而不是遞歸解決 問題,從而避免了棧溢出。當函數被標記爲 tailrec 時,編譯器會優化遞歸,並 用高效迅速的循環代替它。

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

這段代碼計算的是數學上的餘弦不動點。Math.cos 從 1.0 開始不斷重複,直到值不 變爲止,結果是 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 修飾符必須在最後一個操作中調用自己。在遞歸調用代碼後面是不 允許有其它代碼的,並且也不可以在 try/catch/finall 塊中進行使用。當前的尾遞歸 只在 JVM 的後端中可以用.

這篇文章主要分享Kotlin中的函數.

本人也是在初學Kotlin,如有錯誤,請幫忙指出,持續更新

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章