高阶函数

一个高阶函数就是可以将一个函数作为参数的函数,或者返回一个函数。一个比较好的例子就是这个函数就是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是单个参数的隐式名字,如果函数只有一个参数,它的定义(包括->)可以取消。

results matching ""

    No results matching ""