Kotlin 中 Lambda 表达式的语法结构及简化推导
在 Kotlin 编程中,Lambda 表达式是一项非常实用且强大的功能。今天,我们就来深入探讨一下 Lambda 表达式的语法结构,以及它那些令人 “又爱又恨” 的简化写法。
一、Lambda 表达式完整语法结构
Lambda 表达式最完整的语法结构定义为{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体} 。这里,最外层的大括号是 Lambda 表达式的标志;如果有参数传入,需要在大括号内声明参数列表,参数列表以->符号结尾,该符号同时也表示函数体的开始。在函数体中,我们可以编写代码,但不建议编写过长的代码,因为最后一行代码会自动作为 Lambda 表达式的返回值。
二、通过实例理解 Lambda 表达式的应用
以找出单词最长的水果为例,我们常用的函数式 API 中maxBy函数,本质上就是一个接收 Lambda 类型参数的普通函数。在遍历集合时,maxBy函数会将每次遍历的值作为参数传递给 Lambda 表达式,根据我们传入的条件来遍历集合,从而找到该条件下的最大值。
比如,我们有如下水果列表:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
想要找到单词最长的水果,条件自然是单词的长度。我们套用 Lambda 表达式完整语法结构来使用maxBy函数:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
val lambda = { fruit: String -> fruit.length }
val maxLengthFruit = list.maxBy(lambda)
在这段代码中,maxBy函数接收了一个 Lambda 参数,该参数完全遵循我们前面学习的表达式语法结构,相对来说比较容易理解。
三、Lambda 表达式的逐步简化
虽然上述写法可以正常运行,但略显啰嗦,有许多可简化的地方。接下来,我们就通过一步步推导,让代码变得更加简洁。
第一步:直接传入 Lambda 表达式
我们不需要专门定义一个lambda变量,而是可以直接将 Lambda 表达式传入maxBy函数当中,简化后的代码如下:
val maxLengthFruit = list.maxBy({ fruit: String -> fruit.length })
第二步:调整 Lambda 表达式位置
Kotlin 规定,当 Lambda 参数是函数的最后一个参数时,可以将 Lambda 表达式移到函数括号的外面,代码进一步简化为:
val maxLengthFruit = list.maxBy() { fruit: String -> fruit.length }
第三步:省略函数括号
如果 Lambda 参数是函数的唯一一个参数,还能将函数的括号省略,代码变成:
val maxLengthFruit = list.maxBy { fruit: String -> fruit.length }
此时,代码看起来清爽了许多。
第四步:利用类型推导省略参数类型
由于 Kotlin 拥有出色的类型推导机制,Lambda 表达式中的参数列表在大多数情况下不必声明参数类型,代码可进一步简化:
val maxLengthFruit = list.maxBy { fruit -> fruit.length }
第五步:使用it关键字
当 Lambda 表达式的参数列表中只有一个参数时,也不必声明参数名,而是可以使用it关键字来代替,最终得到的代码为:
val maxLengthFruit = list.maxBy { it.length }
通过这样一步步的推导,我们就得到了和一开始那段函数式 API 一模一样的简洁写法,是不是对 Lambda 表达式的理解更加深刻、轻松了呢?
掌握 Lambda 表达式的这些语法和简化技巧,能让我们在 Kotlin 编程中写出更加简洁、优雅的代码,提高编程效率。希望今天的分享能帮助大家更好地驾驭 Lambda 表达式!