Korlin中的Lambda表达式

作者: 程序员丶星霖 | 来源:发表于2019-07-30 09:32 被阅读8次

    Lambda表达式的标准语法:

    {(形参列表)->
        //零条到多条可执行语句
    }
    

    一、调用Lambda表达式

    Lambda表达式的本质是功能更灵活的代码块,因此完全可以将Lambda表达式赋值给变量或直接调用Lambda表达式。

    fun main(args: Array<String>) {
        var square = { n: Int ->
            n * n
        }
        //使用square调用Lambda表达式
        println(square(5))
        println(square(10))
        var result = { base: Int, exponent: Int ->
            var result = 1
            for (i in 1..exponent) {
                result *= base
            }
            result
        }(4, 3)
        println(result)
    }
    
    

    输出结果:

    25
    100
    64
    

    二、利用上下文推断类型

    完整的Lambda表达式需要定义形参类型,但是如果Kotlin可以根据Lambda表达式上下文推断出形参类型,那么Lambda表达式就可以省略形参类型。

    fun main(args: Array<String>) {
        var square: (Int) -> Int = { n -> n * n }
        //使用square调用Lambda表达式
        println(square(5))
        println(square(10))
        var result = { base: Int, exponent: Int ->
            var result = 1
            for (i in 1..exponent) {
                result *= base
            }
            result
        }(4, 3)
        println(result)
        var list = listOf("Java", "Kotlin", "Go")
        var rt = list.dropWhile { e -> e.length > 3 }
        println(rt)
    }
    
    

    输出结果:

    25
    100
    64
    [Go]
    

    三、省略形参名

    Lambda表达式不仅可以省略形参类型,而且如果只有一个形参,那么Kotlin允许省略Lambda表达式的形参名。

    如果Lambda表达式省略了形参名,那么此时->也不需要了,Lambda表达式可通过it来代表形参。

    fun main(args: Array<String>) {
        var square: (Int) -> Int = { n -> n * n }
        //使用square调用Lambda表达式
        println(square(5))
        println(square(10))
        var result = { base: Int, exponent: Int ->
            var result = 1
            for (i in 1..exponent) {
                result *= base
            }
            result
        }(4, 3)
        println(result)
        var list = listOf("Java", "Kotlin", "Go")
        //省略形参名,用it代表形参
        var rt = list.dropWhile { it.length > 3 }
        println(rt)
    }
    

    输出结果:

    25
    100
    64
    [Go]
    

    四、调用Lambda表达式的约定

    如果函数的最后一个参数是函数类型,那么允许在圆括号之外指定Lambda表达式。

    fun main(args: Array<String>) {
        var list = listOf("Java", "Kotlin", "Go")
        var rt = list.dropWhile { it.length > 3 }
        println(rt)
    
        var map = mutableMapOf("Android" to 1, "Kotlin" to 2)
        list.associateTo(map) { "我要${it}" to it.length }
        println(map)
    
        var rtx = list.reduce() { acc, e -> acc + e }
        println(rtx)
    }
    
    

    输出结果:

    [Go]
    {Android=1, Kotlin=2, 我要Java=4, 我要Kotlin=6, 我要Go=2}
    JavaKotlinGo
    

    五、个数可变的参数和Lambda参数

    Kotlin约定:如果调用函数时最后一个参数是Lambda表达式,则可将Lambda表达式放在圆括号外面,这样就无须使用命名参数了。

    因此,如果一个函数既包含个数可变的形参,也包含函数类型的形参,就应该将函数类型的形参放在最后。

    fun main(args: Array<String>) {
        var list1 = test("Java", "Kotlin", "Go") { it.length }
        println(list1)
        var list2 = test("Java", "Kotlin", "Go") { "我要学习${it}" }
        println(list2)
    }
    
    fun <T> test(vararg names: String, transform: (String) -> T): List<T> {
        var mutableList: MutableList<T> = mutableListOf()
        for (name in names) {
            mutableList.add(transform(name))
        }
        return mutableList.toList()
    }
    
    

    输出结果:

    [4, 6, 2]
    [我要学习Java, 我要学习Kotlin, 我要学习Go]
    

    学海无涯苦作舟

    我的微信公众号.jpg

    相关文章

      网友评论

        本文标题:Korlin中的Lambda表达式

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