Kotlin Lambda 表达式

Lambda表达式

Lambda表达式或简称lambda是一个匿名函数;没有名称的函数。这些函数立即作为表达式传递而无需声明。例如,

fun main(args: Array<String>) {

    val greeting = { println("Hello!")}

    //调用函数
    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表达式为:

Kotlin Lambda表达式语法

请注意,花括号内包含一个lambda表达式。

高阶函数

Koltin对函数式编程提供了强大的支持。您可以将函数作为参数传递给其他函数。另外,您可以从其他函数返回一个函数。这些功能称为高阶函数。

为了方便起见,通常将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() 完成此任务。如果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