高阶函数
一个高阶函数就是可以将一个函数作为参数的函数,或者返回一个函数。一个比较好的例子就是这个函数就是lock()和一个函数,获取这个锁、运行函数、释放锁:
fun <T> lock(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
}
finally {
lock.unlock()
}
}
让我们来检阅一下上述的代码:body是一个函数类型:() -> T,它的含义就是一个没有参数的函数并且返回类型T。函数在try语句块中执行,并且是受lock保护的,它的结果也是通过lock()函数返回的。
如果我们想调用lock()方法,我们可以传递另一个函数作为参数。
fun toBeSynchronized() = sharedResource.operation()
val result = lock(lock, ::toBeSynchronized)
另一种更方便的方式就是传递lambda表达式。
val result = lock(lock, { sharedResource.operation() })
为了能够是内容继续下去,简单介绍一下lambda表达式:
- lambda表达式总是定义在大括号内
- 它的参数(如果有的话)被定义在->之前,参数类型可以忽略。
- 主体部分在->之后
在Kotlin中,如果一个函数的最后一个参数是函数,你可以传入一个lambda表达式,你可以在调用前指定它。
lock (lock) {
sharedResource.operation()
}
另一个高阶函数的例子就是map()函数:
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 }
从上述例子中可以看出,如果lambda表达式是仅有的参数,那么调用函数的括号是可以去掉的。
it是单个参数的隐式名字,如果函数只有一个参数,它的定义(包括->)可以取消。