高阶函数和Lambda表达式
高阶函数
高阶函数是一种“使用函数当参数或者返回一个函数”的函数。一个好的例子是lock()
,它的参数是一个Lock
对象和一个函数,在函数内得到锁,执行函数最后释放锁:
fun <T> lock(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
}
finally {
lock.unlock()
}
}
让我们检查一下上面的代码:body
拥有一个函数类型:()->T
,所以它应该是一个无参函数并返回T
。它持有锁并在try-catch
代码块中被调用,结果被lock()
返回。
如果我们想调用lock()
,我们可以传入另一个函数作为其参数(参见function references):
fun toBeSynchronized() = sharedResource.operation()
val result = lock(lock, ::toBeSynchronized)
此外,更方便的方法是传入一个lambda表达式:
val result = lock(lock, { sharedResource.operation() })
下面会详细讲lambda
表达式,我们这里简单看一下:
lambda
表达式总是被{}
围着;- 它的参数在
->
前声明,参数可以省略不写; - 函数体在
->
后(如果存在函数体)。