原创

Korlin中的Lambda表达式

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

基本语法
  • 作者:HunterArley (联系作者)
  • 发表时间:2019-11-21 10:44
  • 版权声明:本网站部分内容转载于合作站点或其他站点,但都会注明作/译者和原出处。如有不妥之处,敬请指出。
  • 公众号转载:请在文末添加作者公众号二维码