Lambda表达式
基本语法结构
{参数名 1 : 参数类型 , 参数名 2 :参数类型 -> 函数体 }
“->”前的部分为参数列表,后面的是函数体。
参数列表为传入Lambda的数据信息。
函数体为逻辑代码,并且最后一行代码会自动作为Lambda表达式的返回值。
使用案例 1
定义一个List,存放各种水果的名字,通过使用maxBy函数 和 Lambda表达式来查找出List中名字最长的水果是哪一个。
测试代码 1
fun main(){ val list = listOf("Apple","Banana","Orange","Pear") val lambda = {fruitName:String -> fruitName.length} val maxLengthFruit = list.maxOf(lambda) println(maxLengthFruit) }
输出结果:
6
测试代码1中,为了清晰,我们将lambda表达式单独提取出来作为一个变量,其实,我们可以省去这个变量,直接将lambda表达式传入maxBy函数中。所以,我们可以做如下简化:
测试代码 2
fun main(){ val list = listOf("Apple","Banana","Orange","Pear") //val lambda = {fruitName:String -> fruitName.length} val maxLengthFruit = list.maxOf({fruitName:String -> fruitName.length}) println(maxLengthFruit) }
然后Kotlin规定,当Lambda参数是函数的最后一个参数时,可以将Lambda表达式移到函数括号的外面,因此可以对测试代码2进行简化:
测试代码 3
fun main(){ val list = listOf("Apple","Banana","Orange","Pear") //val lambda = {fruitName:String -> fruitName.length} //val maxLengthFruit = list.maxOf({fruitName:String -> fruitName.length})package val maxLengthFruit = list.maxOf(){fruitName:String -> fruitName.length} println(maxLengthFruit) }
Kotlin还规定,如果Lambda参数是函数的唯一一个参数的话,还可以将函数的括号省略,所以测试代码 3可以进一步简化:
测试代码 4
fun main(){ val list = listOf("Apple","Banana","Orange","Pear") //val lambda = {fruitName:String -> fruitName.length} //val maxLengthFruit = list.maxOf({fruitName:String -> fruitName.length})package //val maxLengthFruit = list.maxOf(){fruitName:String -> fruitName.length} val maxLengthFruit = list.maxOf{fruitName:String -> fruitName.length} println(maxLengthFruit) }
由于Kotlin拥有出色的类型推导机制,Lambda表达式中的参数列表其实在大多数情况下不必声明参数类型,因此代码可以进一步简化成:
测试代码 5
fun main(){ val list = listOf("Apple","Banana","Orange","Pear") //val lambda = {fruitName:String -> fruitName.length} //val maxLengthFruit = list.maxOf({fruitName:String -> fruitName.length})package //val maxLengthFruit = list.maxOf(){fruitName:String -> fruitName.length} //val maxLengthFruit = list.maxOf{fruitName:String -> fruitName.length} val maxLengthFruit = list.maxOf{fruitName-> fruitName.length} println(maxLengthFruit) }
当Lambda表达式的参数列表中只有一个参数时,也不必声明参数名,而是可以使用it关键字来代替,所以,代码可以最终简化为:
最终代码
fun main(){ val list = listOf("Apple","Banana","Orange","Pear") //val lambda = {fruitName:String -> fruitName.length} //val maxLengthFruit = list.maxOf({fruitName:String -> fruitName.length})package //val maxLengthFruit = list.maxOf(){fruitName:String -> fruitName.length} //val maxLengthFruit = list.maxOf{fruitName:String -> fruitName.length} //val maxLengthFruit = list.maxOf{fruitName-> fruitName.length} val maxLengthFruit = list.maxOf{it.length} println(maxLengthFruit) }
使用案例 2
还是一个List,里面还是存放一些水果的名字,先将其中的名字字符长度小于等于5的水果的名字全部变成大写字母拼写:
fun main(){ val list = listOf("Apple","Banana","Orange","Pear") val newList = list.filter{it.length<=5}.map{ it.toUpperCase() } for(fruit in newList){ println(fruit) } }
输出结果:
APPLE PEAR
filter函数会对list中的元素根据Lambda中的规则进行过滤,然后map函数会根据Lambda中的规则进一步映射出一个新的集合。
使用案例 3
一个List,存放各种水果的名字,先判断:
- 其中是否存在字符串长度为10的水果名字。
- 其中是否所有的水果名字字符串长度都大于2.
fun main(){ val list = listOf("Apple","Banana","Orange","Pear") val isAnyRes = list.any{ it.length >10 } val isAllRes = list.all{ it.length >2 } println("isAnyRes : "+isAnyRes) println("isAllRes : "+isAllRes) }
输出结果:
isAnyRes : false isAllRes : true