Kotlin匿名函数

作者: 程序员丶星霖 | 来源:发表于2019-07-31 13:48 被阅读26次

    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

    相关文章

      网友评论

        本文标题:Kotlin匿名函数

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