写什么零基础系列太累人了,幸好放弃掉了然后写点什么呢?
高阶函数
先了解 高阶函数
的定义。搬运官方文档内容:高阶函数是将函数用作参数或返回值的函数。这里用到将函数当做参数的例子。
fun <T> lock(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
}
finally {
lock.unlock()
}
}
初学者看可能会有点蒙,不明白 body: () -> T
的含义这就要引入另一个概念 函数类型
。
函数类型
上面例子把函数当做参数使用,同一般参数一样需要有个类型,函数也是个类型称作 函数类型
。body: () -> T
为例 :
为声明分割 body
为参数名即函数名 () -> T
为不带参数函数返回值为泛型 T
。
匿名函数
匿名函数
顾名思义没有名字的函数,因为函数类型把函数名字给抢了,所以调用的函数就没了名字了。
val result = lock(lock, fun{ sharedResource.operation() })
接收者函数
接收者函数
可理解为特殊的函数类型。这个函数类型必须要接收一个参数,在这个函数类型内可以直接调用这个参数拥有的函数。有点拗口直接看例子:
class HTML {
fun body() { }
}
//HTML类型的接收者函数
fun html(init: HTML.() -> Unit): HTML {
val html = HTML() // 创建参数
html.init() // 参数传给接收者函数
return html
}
调用上
html(fun HTML.() {
body() //直接调用HTML拥有的函数
})
Lambda表达式
就当作匿名函数的简写吧。
上面例子的匿名函数都是不带参数的可以简写成如下
lock(lock, { sharedResource.operation() })
html({
body()
})
// 最后一个参数是函数类型还可以继续简写
lock (lock) {
sharedResource.operation()
}
html {
body()
}
单个参数的简写
val list = listOf(0, 1, 2, 3, 4)
list.map { value ->
println(value)
}
// 单个参数隐式名称it
list.map {
println(it)
}
多个参数简写
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")
}
// 不使用参数_代替
map.forEach { _, v ->
print(v)
}