寫什么零基礎(chǔ)系列太累人了,幸好放棄掉了然后寫點什么呢秧秉?
高階函數(shù)
先了解 高階函數(shù)
的定義褐桌。搬運(yùn)官方文檔內(nèi)容:高階函數(shù)是將函數(shù)用作參數(shù)或返回值的函數(shù)。這里用到將函數(shù)當(dāng)做參數(shù)的例子象迎。
fun <T> lock(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
}
finally {
lock.unlock()
}
}
初學(xué)者看可能會有點蒙荧嵌,不明白 body: () -> T
的含義這就要引入另一個概念 函數(shù)類型
呛踊。
函數(shù)類型
上面例子把函數(shù)當(dāng)做參數(shù)使用,同一般參數(shù)一樣需要有個類型啦撮,函數(shù)也是個類型稱作 函數(shù)類型
谭网。body: () -> T
為例 :
為聲明分割 body
為參數(shù)名即函數(shù)名 () -> T
為不帶參數(shù)函數(shù)返回值為泛型 T
。
匿名函數(shù)
匿名函數(shù)
顧名思義沒有名字的函數(shù)赃春,因為函數(shù)類型把函數(shù)名字給搶了愉择,所以調(diào)用的函數(shù)就沒了名字了。
val result = lock(lock, fun{ sharedResource.operation() })
接收者函數(shù)
接收者函數(shù)
可理解為特殊的函數(shù)類型聘鳞。這個函數(shù)類型必須要接收一個參數(shù)薄辅,在這個函數(shù)類型內(nèi)可以直接調(diào)用這個參數(shù)擁有的函數(shù)。有點拗口直接看例子:
class HTML {
fun body() { }
}
//HTML類型的接收者函數(shù)
fun html(init: HTML.() -> Unit): HTML {
val html = HTML() // 創(chuàng)建參數(shù)
html.init() // 參數(shù)傳給接收者函數(shù)
return html
}
調(diào)用上
html(fun HTML.() {
body() //直接調(diào)用HTML擁有的函數(shù)
})
Lambda表達(dá)式
就當(dāng)作匿名函數(shù)的簡寫吧抠璃。
上面例子的匿名函數(shù)都是不帶參數(shù)的可以簡寫成如下
lock(lock, { sharedResource.operation() })
html({
body()
})
// 最后一個參數(shù)是函數(shù)類型還可以繼續(xù)簡寫
lock (lock) {
sharedResource.operation()
}
html {
body()
}
單個參數(shù)的簡寫
val list = listOf(0, 1, 2, 3, 4)
list.map { value ->
println(value)
}
// 單個參數(shù)隱式名稱it
list.map {
println(it)
}
多個參數(shù)簡寫
val map = hashMapOf(
0 to 0,
1 to 1,
2 to 2,
3 to 3,
4 to 4
)
map.forEach { k, v ->
print("$k, $v")
}
// 不使用參數(shù)_代替
map.forEach { _, v ->
print(v)
}