第三章、函數(shù)的定義與調(diào)用
val map = hashMapOf(1 to "one")
to并不是一個特殊的結(jié)構(gòu),而是一個普通函數(shù),被稱為中綴調(diào)用。
要允許使用中綴符號調(diào)用函數(shù),需要使用infix修飾符來標記它。
to函數(shù)聲明:
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
Pair是Kotlin標準庫中的類。Pair用來表示一對元素。
可以直接用Pair的內(nèi)容來初始化兩個變量
var (number, name) = 1 to "one"
這個功能稱為解構(gòu)聲明。
命名參數(shù)和默認值參數(shù)
在Kotlin中,可以在聲明函數(shù)的時候,指定參數(shù)的默認值。
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()
}
fun main(args: Array<String>) {
val list = listOf(1, 2, 3)
println(joinToString(list, "; ", "(", ")"))
println(joinToString(list))
println(joinToString(list, postfix=".", prefix="#"))
}
輸出結(jié)果:
(1; 2; 3)
(1,2,3)
#1,2,3.
注意:參數(shù)的默認值是被編碼到被調(diào)用的函數(shù)中,而不是調(diào)用的地方。
Java沒有參數(shù)默認值的概念。從Java中調(diào)用Kotlin函數(shù)的時候必須顯式地指定所有參數(shù)值。如果需要從java代碼中做頻繁調(diào)用,可以使用@JvmOverloads注解它。這個只是編譯器生成Java重載函數(shù),從最后一個開始省略每個參數(shù)。每個重載函數(shù)的默認參數(shù)值都會被省略。
Jvm只能執(zhí)行類中的代碼。
更改文件類名:@file:JvmName("XXX")。位置:文件開頭,包名之前。
擴展方法和屬性:
擴展函數(shù)并不存在重寫,因為Kotlin會把它們當做靜態(tài)函數(shù)。
如果一個類的成員函數(shù)和擴展函數(shù)有相同的簽名,成員函數(shù)往往會被優(yōu)先使用。
可變參數(shù)的關鍵字vararg,可以用來聲明一個函數(shù)將可能有任意數(shù)量的參數(shù)
但是當傳遞的參數(shù)是已經(jīng)包裝在數(shù)組中時,Kotlin需要顯式地解包數(shù)組,以便每個數(shù)組元素在函數(shù)中能作為單獨的參數(shù)來調(diào)用。即*,被稱為展開運算符。
val arg= arrayOf(1,2,3)
val list = listOf(*arg)
val list1 = listOf(1,2,*arg)
如果不使用*運算符,則list中的數(shù)據(jù)類型為Array[Int],而不是Int。