天天看點

Kotlin文法(函數和lambda表達式)三、函數和lambda表達式

函數參數是用 Pascal 符号定義的 name:type。參數之間用逗号隔開,每個參數必須指明類型。函數參數可以有預設參數。這樣相比其他語言可以減少重載。

在調用函數時可以參數可以命名。這對于有很多參數或隻有一個的函數來說很友善。

傳遞一個 array 的内容給函數,我們就可以使用 * 字首操作符:

Kotlin 中可以在檔案個根級聲明函數,這就意味者你不用建立一個類來持有函數。除了頂級函數,Kotlin 函數可以聲明為局部的,作為成員函數或擴充函數。

Kotlin 支援局部函數,比如在另一個函數使用另一函數。局部函數可以通路外部函數的局部變量(比如閉包)。局部函數甚至可以傳回到外部函數

高階函數就是可以接受函數作為參數并傳回一個函數的函數。比如 lock() 就是一個很好的例子,它接收一個 lock 對象和一個函數,運作函數并釋放 lock;

其實最友善的辦法是傳遞一個字面函數(通常是 lambda 表達式):

在 kotlin 中有一個約定,如果最後一個參數是函數,可以省略括号:

字面函數被包在大括号裡

參數在 -> 前面聲明(參數類型可以省略)

函數體在 -> 之後

字面函數或函數表達式就是一個 "匿名函數",也就是沒有聲明的函數,但立即作為表達式傳遞下去。

如:(T, T) -> Boolean

注意如果一個函數接受另一個函數做為最後一個參數,該函數文本參數可以在括号内的參數清單外的傳遞。

函數文本的完全寫法是下面這樣的:

函數文本總是在大括号裡包裹着,在完全文法中參數聲明是在括号内,類型注解是可選的,函數體是在 -> 之後,像下面這樣:

在高階函數前增加inline注解可以指定函數內聯。inline 标記即影響函數本身也影響傳遞進來的 lambda 函數:所有的這些都将被關聯到調用點。

内聯可能會引起生成代碼增長,是以可以使用noinline來指定某些函數不進行內聯。

注意有些内聯函數可以調用傳遞進來的 lambda 函數,但不是在函數體,而是在另一個執行的上下文中,比如局部對象或者一個嵌套函數。在這樣的情形中,非局部的控制流也不允許在lambda 函數中。為了表明,lambda 參數需要有 InlineOptions.ONLY_LOCAL_RETURN 注解

參考:

<a href="http://kotlinlang.org/docs/reference/basic-syntax.html">http://kotlinlang.org/docs/reference/basic-syntax.html</a>

<a href="http://huanglizhuo.gitbooks.io/kotlin-in-chinese">http://huanglizhuo.gitbooks.io/kotlin-in-chinese</a>