Kotlin笔记17--集合的函数式API之Lambda表达式

36 篇文章 2 订阅

主要学习下 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 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值