三、在Kotlin中使用Lambda

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,存放各种水果的名字,先判断:

  1. 其中是否存在字符串长度为10的水果名字。
  2. 其中是否所有的水果名字字符串长度都大于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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值