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

请注意,花括号内包含一个lambda表达式。
Koltin对函数式编程提供了强大的支持。您可以将函数作为参数传递给其他函数。另外,您可以从其他函数返回一个函数。这些功能称为高阶函数。
为了方便起见,通常将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()函数返回产生给定函数最大值的第一个元素;如果没有元素,则返回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对象。
在上面的程序中,lambda表达式只接受一个参数(Person对象的列表)。在这种情况下,可以使用关键字 it 来引用参数。
您可以
val selectedPerson = people.maxBy({ person -> person.age })等效于
val selectedPerson = people.maxBy({ it.age })在上面的程序中。
下面的程序计算以字母 S 开头的 Person对象 的最大年龄。
我们将使用两个库函数 maxBy() 和 startsWith() 完成此任务。如果StarsWith()函数是以作为参数传递的指定字符开头,则返回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