Kotlin Lambda 表达式

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 表达式是

Kotlin lambda expression syntax

请注意,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
你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战