函數(shù)
參數(shù):Pascal表示法 ---》 name : type
- 多參數(shù)用逗號隔開
- 參數(shù)賦值: 例如 name:type = 給予的默認值(= value如果沒有默認值,這部分是可以省略的)
- 覆蓋方法(override)總是使用與基類型方法相同的默認參數(shù)值婿脸。當覆蓋一個帶有默認參數(shù)值的方法時粱胜,必須從簽名中省略默認參數(shù)值狐树。
具名參數(shù): name = value
在多參數(shù)的函數(shù)中,如果有些參數(shù)添加了默認值抑钟,這時在調用時涯曲,就可以省略掉在塔,但是調用時必須使用具名參數(shù)格式調用幻件,例子如下:
多參函數(shù)
fun foo(bar: Int = 0, baz: Int) { /*……*/ }
省略默認值參數(shù)蛔溃,使用具名參數(shù)調用
foo(baz = 1) // 使用默認值 bar = 0
函數(shù)如果在默認參數(shù)的最后一個參數(shù)是Lambda表達式, 那么它可以用具名參數(shù)在括號內傳入贺待,也可以在括號外傳入。
例子:
多默認參數(shù)函數(shù)
fun foo(bar: Int = 0, baz: Int = 1, qux: () -> Unit) { /*……*/ }
foo(1) { println("hello") } // 使用默認值 baz = 1
foo(qux = { println("hello") }) // 使用兩個默認值 bar = 0 與 baz = 1
foo { println("hello") } // 使用兩個默認值 bar = 0 與 baz = 1
當一個函數(shù)調用混用位置參數(shù)與具名參數(shù)時狠持,所有位置參數(shù)都要放在第一個具名參數(shù)之前疟位。例如喘垂,允許調用f(1,y=2) 但不允許f(x=1,2)。
可以通過使用星號操作符將可變數(shù)量參數(shù)(vararg)以具名形式傳入:
fun foo(vararg string:String){/******/}
調用
foo(string = *arrayOf("a", "b", "c"))
返回Unit函數(shù)
在函數(shù)中Unit的返回類型是可選的:return Unit 或者 return
可變數(shù)量參數(shù)
函數(shù)中可以用可變數(shù)量參數(shù)正勒,但是一般都是放在參數(shù)的最后一個(如果不是最后一個,那此參數(shù)后面參數(shù)使用具名參數(shù)語法傳入)章贞,可以用vararg修飾符標記
例子:
fun <T> asList(vararg ts: T): List<T> {
val result = ArrayList<T>()
for (t in ts) // ts is an Array
result.add(t)
return result
}
調用:
val list = asList(1,2,3)
如果已經有一個數(shù)組并希望將其內容傳給該函數(shù)祥绞,我們使用伸展(spread)操作符(在數(shù)組前面加*)
調用例子:
val a = arrayOf(1, 2, 3)
val list = asList(-1, 0, *a, 4)
函數(shù)的作用域
局部函數(shù)
kotlin支持局部函數(shù)鸭限,即一個函數(shù)在另一個函數(shù)內部。
fun dfs(graph: Graph) {
fun dfs(current: Vertex, visited: MutableSet<Vertex>) {
if (!visited.add(current)) return
for (v in current.neighbors)
dfs(v, visited)
}
dfs(graph.vertices[0], HashSet())
}
局部函數(shù)可以訪問外部函數(shù)(即閉包)的局部變量败京,所以在上例中,visited可以是局部變量:
fun dfs(graph: Graph) {
val visited = HashSet<Vertex>()
fun dfs(current: Vertex) {
if (!visited.add(current)) return
for (v in current.neighbors)
dfs(v)
}
dfs(graph.vertices[0])
}
成員函數(shù)
成員函數(shù)是在類或對象內部定義的函數(shù)
class Sample() {
fun foo() { print("Foo") }
}
成員函數(shù)以點表示法調用
Sample().foo() // 創(chuàng)建類 Sample 實例并調用 foo
泛型函數(shù)
函數(shù)可以有泛型參數(shù)赡麦,通過在函數(shù)名前使用尖括號指定:
fun <T> singletonList(item: T): List<T> { /*……*/ }