美文网首页
Kotlin中的高阶函数和lambda表达式

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

作者: 43d60efa37c7 | 来源:发表于2017-05-23 18:25 被阅读713次

    更新:好气呀,找到了中文网站 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表达式或一个匿名函数是一个“函数文本”,即一个未声明的函数,但作为表达式直接传递。

    相关文章

      网友评论

          本文标题:Kotlin中的高阶函数和lambda表达式

          本文链接:https://www.haomeiwen.com/subject/jhxgxxtx.html