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