Lambda 表达式
Lambda 表达式,或者简称为 lambda,是一个匿名函数;即一个没有名称的函数。这些函数在声明之前立即作为表达式传递。例如,
fun main(args: Array<String>) {
val greeting = { println("Hello!")}
// invoking function
greeting()
}
运行程序后,输出将是
Hello!
这里,一个 lambda 表达式被赋值给变量 greeting。在该程序中,该表达式不接受任何参数,也不返回值。
然后,该函数(lambda 表达式)被调用为
greeting()
示例:带参数和返回类型的 Lambda
下面的程序有一个 lambda 表达式,它接受两个整数作为参数,并返回这两个整数的乘积。
fun main(args: Array<String>) {
val product = { a: Int, b: Int -> a * b }
val result = product(9, 3)
println(result)
}
运行程序后,输出将是
27
这里,lambda 表达式是

请注意,lambda 表达式包含在大括号中。
高阶函数
Kotlin 对 函数式编程 有很好的支持。您可以将函数作为参数传递给其他函数。您也可以从其他函数返回一个函数。这些函数称为高阶函数。
通常,lambda 表达式被传递给高阶函数(而不是典型的函数)以方便使用。
示例:将 Lambda 传递给函数
让我们将一个 lambda 表达式传递给一个高阶函数。方法如下。
fun callMe(greeting: () -> Unit) {
greeting()
}
fun main(args: Array<String>) {
callMe({ println("Hello!") })
}
运行程序后,输出将是
Hello!
这里,callMe()
是一个高阶函数(因为它接受一个函数作为参数)。greeting 参数接受传递给 callMe()
函数的 lambda,形式如下:
greeting: () -> Unit
空括号表示传递的匿名函数不接受任何参数。而 Unit
关键字表示匿名函数不返回任何值。
Lambda 经常用于处理集合。标准库中有许多内置函数,它们接受 lambda 以使我们的任务更加轻松。这里将展示几个示例。
示例:maxBy() 函数
maxBy() 函数返回给定函数产生最大值的第一个元素,如果没有任何元素则返回 null
。
data class Person(val name: String, val age: Int)
fun main(args: Array<String>) {
val people = listOf(
Person("Jack", 34),
Person("Shelly", 19),
Person("Patrick", 13),
Person("Jill", 12),
Person("Shane", 22),
Person("Joe", 18)
)
val selectedPerson = people.maxBy({ person -> person.age })
println(selectedPerson)
println("name: ${selectedPerson?.name}" )
println("age: ${selectedPerson?.age}" )
}
运行程序后,输出将是
Person(name=Jack, age=34) name: Jack age: 34
这里,maxBy()
函数接受一个 Person 对象列表,并返回年龄最大的 Person 对象。
it 关键字:用于单个参数
在上面的程序中,lambda 表达式只接受一个参数(Person 对象列表)。在这种情况下,您可以使用关键字 it
来引用该参数。
您可以替换
val selectedPerson = people.maxBy({ person -> person.age })
为
val selectedPerson = people.maxBy({ it.age })
在上面的程序中。
示例:maxBy() 和 startsWith() 函数
下面的程序计算以字母 S 开头的 Person 对象的最大年龄。
我们将使用两个库函数 maxBy()
和 startsWith()
来完成此任务。 startsWith() 函数在以传递的指定字符开头时返回 true
。
data class Person(val name: String, val age: Int)
fun main(args: Array<String>) {
val people = listOf(
Person("Jack", 34),
Person("Shelly", 19),
Person("Patrick", 13),
Person("Jill", 12),
Person("Shane", 22),
Person("Joe", 18)
)
val selectedPerson = people
.filter { it.name.startsWith("S") }
.maxBy{ it.age }
println(selectedPerson)
println("name: ${selectedPerson?.name}" )
println("age: ${selectedPerson?.age}" )
}
运行程序后,输出将是
Person(name=Shane, age=22) name: Shane age: 22
推荐阅读
- Kotlin 闭包
- Kotlin With 和 apply