- Kotlin入门笔记一:方法、变量、类
- Kotlin入门笔记二:when、for、in
- Kotlin入门笔记三:可空类型
- Kotlin入门笔记四:集合
- Kotlin入门笔记五:可见修饰符
- Kotlin入门笔记六:Lambda语法
- Kotlin入门笔记七:Lambda之引用
- Kotlin入门笔记八:Lambda和序列
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表达式括号的简化:
-
在Kotlin实战这本书籍中提到了,Kotlin有这样一种语法约定,如果Lambda表达式是函数调用的最后一个参数,它可以放到括号外面,在上面的例子中,
{ p: Person -> p.age % 2 == 0 }
Lambda表达式是filter()
函数的唯一参数,所以可以放到括号外面,写法为:
list.filter() { p: Person -> p.age % 2 == 0 }
-
当Lambda表达式是函数唯一的实参时,还可以去掉调用代码中的空括号对,写法为:
list.filter { p: Person -> p.age % 2 == 0 }
这里你需要注意下,当函数存在两个或两个以上Lambda实参时,就不能把所有的Lambda表达式都放在括号外面了,这时候你应该使用常规的语法。
Lambda表达式参数的简化:
通过上面两部的操作,在只存在一个Lambda表达式作为实参时,我们可以去除函数的括号,下面我们来继续优化函数实参:
-
对面
list.filter { p: Person -> p.age % 2 == 0 }
函数来说,实参只有一个p
,而且其类型始终和集合list
元素的类型相同,编译器知道你是对一个Person对象的集合调用filter
函数,所有编译器能推断Lambda表达式的参数会是Person类型。这时候我们就可以不用声明参数的类型,写法如下:
list.filter { p -> p.age % 2 == 0 }
-
通过上面这步,大致已经简化到了最优的了,这时候大家可以通过编译器的智能推荐功能(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
网友评论