Kotlin中的高阶函数和lambda表达式
更新:好气呀,找到了中文网站 https://www.kotlincn.net/docs/reference/lambdas.html
高阶函数
Kotlin官网中的说明:
A higher-order function is a function that takes functions as parameters, or returns a function. A good example of such a function is lock() that takes a lock object and a function, acquires the lock, runs the function and releases the lock:
fun <T> lock(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
}
finally {
lock.unlock()
}
}
在上面的例子中,body的函数类型(function type)是 () -> T,所以它应该是一个无参的、返回值为T的函数。body在try代码块中执行,被lock 锁住,并且,它的返回值会被函数lock()返回。
关于函数类型
对于接受另一个函数作为参数的函数,我们必须为该参数指定函数类型,比如参数类型为(S , T) -> R,代表参数是一个,参数类型为S和T、返回值类型为R,的函数
如果要调用lock(),可以传一个函数进去
fun toBeSynchronized() = sharedResource.operation()
val result = lock(lock, ::toBeSynchronized)
或者是一个lambda表达式
val result = lock(lock, {sharedResource.operation()})
lambda表达式的简要说明:
- Lambda表达一般使用“{ }”包围
- 它的参数(如果有的话)在“->”前定义,参数类型可能是省略的
- 函数体跟在“->”后面
在Kotlin中,若函数最后一个参数为函数类型,调用时,该参数可以放到函数“()”的外面,所以上面的代码可以写成
val result = lock (lock) {
sharedResource.operation()
}
高阶函数的另一个例子
fun <T, R> List<T>.map(transform: (T) -> R): List<R> {
val result = arrayListOf<R>()
for (item in this)
result.add(transform(item))
return result
}
这个函数可以被这样调用
val doubled = ints.map { value -> value * 2 }
注意map没有(),如果lambda表达式是唯一的参数时,()是可以省略的
it —— 单个参数的隐式名称
如果一个函数只有一个参数,那么它的声明可以省略(连同“->”一起),它的名称将是 it
ints.map { it * 2 }
lambda表达式和匿名函数
官网说明:
A lambda expression or an anonymous function is a "function literal", i.e. a function that is not declared, but passed immediately as an expression.
一个lambda表达式或一个匿名函数是一个“函数文本”,即一个未声明的函数,但作为表达式直接传递。