原创

Kotlin匿名函数

Lambda表达式虽然简洁、方便,但是它有个缺陷:Lambda表达式不能指定返回值类型。

大部分的时候,Kotlin可以推断出Lambda表达式的返回值类型。在一些特殊的场景下,Kotlin无法推断出Lambda表达式的返回值类型,需要显式指定返回值类型,匿名函数即可代替Lambda表达式

一、匿名函数的用法

fun main(args: Array<String>) {
    //定义匿名函数,赋值给test变量
    var test = fun(x: Int, y: Int): Int {
        return x + y
    }
    //通过test调用匿名函数
    println(test(2, 4))
}

输出结果:

6

匿名函数与普通函数基本相似,只是将普通函数的函数名去掉而已。

如果系统可以推断出匿名函数的形参类型,那么匿名函数允许省略形参类型。

fun main(args: Array<String>) {
    var filteredList = listOf(3, 5, 20, 100, -25).filter(
        //使用匿名函数作为filter()方法的参数
        fun(el): Boolean {
            return Math.abs(el) > 20
        })
    println(filteredList)
}

输出结果:

[100, -25]

匿名函数的返回值类型的声明规则与普通函数相同: 如果使用普通代码块作为函数体,则匿名函数需要显式指定返回值类型,否则认为该匿名函数没有返回值; 如果使用单表达式作为函数体,则无需指定返回值类型,系统可以自动推断。

fun main(args: Array<String>) {
    //定义匿名函数的函数体是单表达式,可以省略声明函数的返回值类型
    var wawa = fun(x: Int, y: Int) = x + y
    //通过wawa调用匿名函数
    println(wawa(2, 4))
    var rt = listOf(3, 5, 20, 100, -25).filter(
        fun(el) = Math.abs(el) > 20
    )
    println(rt)
}

输出结果:

6
[100, -25]

二、匿名函数和Lambda表达式

匿名函数的本质依旧是函数,因此匿名函数的return则用于返回该函数本身。Lambda表达式的return用于返回它所在的函数,而不是返回Lambda表达式。

fun main(args: Array<String>) {
    var list = listOf(3, 5, 30, -25, 14)
    //使用匿名函数执行forEach()方法
    list.forEach(fun(n) {
        println("元素依次为:${n}")
        //匿名函数中的return用于返回该函数本身
        return
    })
    //使用Lambda表达式执行forEach()方法
    list.forEach({n->
        println("元素依次为:${n}")
        //Lambda表达式中的return用于返回它所在的函数
        return
    })
}

输出结果:

元素依次为:3
元素依次为:5
元素依次为:30
元素依次为:-25
元素依次为:14
元素依次为:3

如果想在Lambda表达式中使用return,则可使用限定返回的语法。

    list.forEach({n->
        println("元素依次为:${n}")
        //Lambda表达式中的return用于返回它所在的函数
        return@forEach
    })

上式即可正常遍历。

学海无涯苦作舟

我的微信公众号.jpg

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