Kotlin中的高阶函数和lambda表达式

2017-05-23  本文已影响713人  43d60efa37c7

更新:好气呀,找到了中文网站 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表达式的简要说明:

在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表达式或一个匿名函数是一个“函数文本”,即一个未声明的函数,但作为表达式直接传递。

上一篇下一篇

猜你喜欢

热点阅读