主要学习下 Lambda 表达式。
一个小例子,找到某个集合中名字最长的元素。
val list = listOf("Apple", "Banana", "Cherry", "Durian", "Orange", "Pear", "Watermelon")
var longerName = "";
println("longerName = $longerName")
println("longerName.length = " + longerName.length)
for (item in list){
if (item.length > longerName.length){
longerName = item
}
}
println("longerName = $longerName")
运行结果,
longerName =
longerName.length = 0
longerName = Watermelon
写法没问题,现在上上 API ,简化一下,
val list = listOf("Apple", "Banana", "Cherry", "Durian", "Orange", "Pear", "Watermelon")
val longerNameFruit1 = list.maxBy { it.length }
val longerNameFruit2 = list.maxByOrNull { it.length }
println("longerNameFruit1 = $longerNameFruit1")
println("longerNameFruit2 = $longerNameFruit2")
其中 maxBy
标记为弃用 @Deprecated
,建议用 maxByOrNull
,这里作为测试,两个都试试。
运行结果,
longerNameFruit1 = Watermelon
longerNameFruit2 = Watermelon
乍一看,黑人问号脸 ,这是啥?
先学一学 Lambda 表达式。
语法结构:
{ 参数名1:参数类型, 参数名2:参数类型 -> 函数体 }
这是完整的表达式。很多时候,简写就可以。
回看例子,
(这里只看 maxByOrNull 函数了)
val list = listOf("Apple", "Banana", "Cherry", "Durian", "Orange", "Pear", "Watermelon")
//val longerNameFruit1 = list.maxBy { it.length }
val longerNameFruit2 = list.maxByOrNull { it.length }
maxByOrNull
函数只是一个普通的函数,不过它接收的参数是 Lambda 类型。它是通过传入的条件来遍历集合,然后找到此条件下的最大值。
1.完整写法:创建 Lambda 表达式,再传值。
val list = listOf("Apple", "Banana", "Cherry", "Durian", "Orange", "Pear", "Watermelon")
val lambda = { item:String -> item.length }
val longerNameFruit = list.maxByOrNull(lambda)
println("longerNameFruit = $longerNameFruit")
2.简化:去掉不必要的变量
val list = listOf("Apple", "Banana", "Cherry", "Durian", "Orange", "Pear", "Watermelon")
val longerNameFruit = list.maxByOrNull({ item:String -> item.length })
println("longerNameFruit = $longerNameFruit")
3.简化:Kotlin 规定,当 Lambda 表达式参数是是函数的最后一个参数时,可以把 Lambda 表达式移到括号外面
val longerNameFruit = list.maxByOrNull(){ item:String -> item.length }
4.简化 : Lambda 参数是函数的唯一参数的话,可以将括号省略
val longerNameFruit = list.maxByOrNull{ item:String -> item.length }
5.类型推导简化 :Kotlin 优秀的类型推导机制, Lambda 表达式的参数列表大多数时候可以省略
val longerNameFruit = list.maxByOrNull{ item -> item.length }
6.参数名简化:如果 Lambda 表达式参数列表只有一个参数,不必声明参数名,可以用 it 关键字代替
val longerNameFruit = list.maxByOrNull{ it -> it.length }
再简化就成了
val longerNameFruit = list.maxByOrNull{ it.length }