Kotlin入门笔记六:Lambda语法

作者: Taonce | 来源:发表于2018-10-10 23:07 被阅读59次
    kotlin

    Lambda表达式的语法:

    在Kotlin中,Lambda表达式的语法如下:

    { x : Int, y : Int -> x + y}
    

    Lambda表达式始终是被{}包围起来的,花括号里面包含了三个部分:参数,函数体和箭头。下面我们通过一个例子详细的了解下Lambda表达式的写法和参数的意义。

    在[集合]{https://www.jianshu.com/p/816fa66badc0}笔记的操作符中,我们提到了Lambda表达式,但是没有做详细说明,现在我们还是通过那个例子来加以说明。代码如下:

    package lambda
    
    data class Person(val age: Int, val name: String)
    
    fun learnLambda() {
        val list = listOf(Person(22, "tao"), Person(23, "Kotlin"), Person(11, "Java"))
        print(list.filter({ p: Person -> p.age % 2 == 0 }))
    }
    
    fun main(args: Array<String>) {
        learnLambda()
    }
    
    // 输出:[Person(age=22, name=tao)]
    

    filter操作符后面就是一个很经典的Lambda表达式,作用是取出集合中年龄除以2取余等于0的项。通过list.filter({ p: Person -> p.age % 2 == 0 })这句代码就能清楚的了解Lambda的整体结构,。但是我们会发现,其实这种写法还是很繁琐,使用Lambda表达式就是为了简化代码,便于理解,这种并没有达到我们想要的目的。接着我们就来一步步的按照Kotlin指定的规则来简化。

    Lambda表达式括号的简化:

    1. 在Kotlin实战这本书籍中提到了,Kotlin有这样一种语法约定,如果Lambda表达式是函数调用的最后一个参数,它可以放到括号外面,在上面的例子中,{ p: Person -> p.age % 2 == 0 }Lambda表达式是filter()函数的唯一参数,所以可以放到括号外面,写法为:
      list.filter() { p: Person -> p.age % 2 == 0 }

    2. 当Lambda表达式是函数唯一的实参时,还可以去掉调用代码中的空括号对,写法为:
      list.filter { p: Person -> p.age % 2 == 0 }

    这里你需要注意下,当函数存在两个或两个以上Lambda实参时,就不能把所有的Lambda表达式都放在括号外面了,这时候你应该使用常规的语法。

    Lambda表达式参数的简化:

    通过上面两部的操作,在只存在一个Lambda表达式作为实参时,我们可以去除函数的括号,下面我们来继续优化函数实参:

    1. 对面list.filter { p: Person -> p.age % 2 == 0 }函数来说,实参只有一个p,而且其类型始终和集合list元素的类型相同,编译器知道你是对一个Person对象的集合调用filter函数,所有编译器能推断Lambda表达式的参数会是Person类型。这时候我们就可以不用声明参数的类型,写法如下:
      list.filter { p -> p.age % 2 == 0 }

    2. 通过上面这步,大致已经简化到了最优的了,这时候大家可以通过编译器的智能推荐功能(Windows:Alt+enter;Mac:option+enter)看到,其实还有可以简化的地方,编译器推荐采用下面的方法:
      list.filter { it.age % 2 == 0 }
      其实这种写法是建立在Lambda表达式只有一个参数,并且这个参数的类型是可以被推导出来的,才会生成it这个名称。it就是代替了我们声明的参数。

    使用it虽然可以很大的简化你的代码,但是切记不可滥用,目前笔者只是用一个Lambda表达式作为示例,如果存在嵌套的Lambda,即使只有Lambda只有一个参数,最好也不要使用it,这样很容易弄混这个it引用的是哪个值,推荐在嵌套的Lambda时,显示的声明每个Lambda的参数。


    总结:

    这份笔记到此就结束啦,主要就是介绍Lambda表达式的一些基本语法和简洁写法。下份笔记将记录于Lambda相关联的成员引用,学习了成员引用之后,Lambda语法将更得心应手。


    写在最后

    每个人不是天生就强大,你若不努力,如何证明自己,加油!

    Thank You!

    --Taonce

    相关文章

      网友评论

        本文标题:Kotlin入门笔记六:Lambda语法

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