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

Kotlin:高阶函数和lambda表达式

作者: 杨殿生 | 来源:发表于2018-08-15 14:31 被阅读0次

    高阶函数

    高阶函数就是可以将函数作为参数在返回函数的函数

    fun <T> lock(lock: Lock, body: () -> T ) : T {
        lock.lock()
        try {
            return body()
        }
        finally {
            lock.unlock()
        }
    }
    
    fun myFunction(){
        println("1111111")
    }
    
    fun main(array: Array<String>) {
        //下面的都是高阶函数的用法
        //传递自定义的函数
        lock(ReentrantLock(), ::myFunction)
        //字面函数(lambda表达式)
        lock(ReentrantLock(),{ println("222222")})
        //函数是最后一个参数()可以省略
        lock(ReentrantLock()){
            println("333333")
        }
    }
    

    body有一个函数类型()->T(把它设想为没有参数返回值为T的函数),它引发内部try代码块,并被lock保护,结果通过lock()函数返回

    字面函数
    字面函数包涵在{}中
    参数在->前面声明(参数可以省略)
    函数体在->之后声明

    kotlin中有一个规定。如果最后一个参数是函数()可以省略

    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
    }
    
    fun main(array: Array<String>) {
        val ints = intArrayOf(1,1,1,1)
        println(ints.map{it -> it*2})
        println(ints.map { it *2 })
    }
    

    高阶函数map中使用

    字面函数

    字面函数或者函数表达式就是一个匿名函数

    fun max(strings: ArrayList<String>, body: (a: String, b: String) -> Boolean):String {
        var i:String = ""
        for (it in strings){
            if (body(it,i)){
                i = it
            }
        }
        return i
    }
    
    fun main(array: Array<String>) {
        val v = arrayListOf("111","2222","3333")
        println(basic.max(v,{a,b -> a.length >= b.length}))
    }
    

    max就是高级函数,其中第二个参数就是字面函数,在max定义的时候使用函数作为参数传入max中,然后在调用max的时候,使用字面函数作为参数传入,上面用例是求出字符串数组中最长的字符串
    上面的body就是(a: String, b: String) -> Boolean 他表示函数类型

    函数文本文法

    val sum1 = {x:Int,y:Int -> x+y}
    val sum:(Int, Int) -> Int = {x, y -> x+y }
    

    上面两种写法是等价的,第一种是完整的写法,第二种是简写,如果没有参数,参数可以省略

    字面函数和表达式函数的另一个区别是没有本地返回。没有 lable 的返回总是返回到 fun 关键字所声明的地方。这意味着字面函数内的返回会返回到一个闭合函数,而表达式函数会返回到函数表达式自身。

    闭包

    一个字面函数或者表达式函数可以访问闭包,即访问自身范围外的声明的变量。不像 java 那样在闭包中的变量可以被捕获修改:

    函数扩展

    val sum = fun Int.(other: Int): Int = this + other
    

    相关文章

      网友评论

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

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