使用Lambda表达式和匿名函数工作
Lambda表达式在理解上有一定的难度。看起来像这样的类型:(Int) -> String ,对许多开发者来说并不直观。本文旨在简化lambda表达式背后的概念以及如何使用它们。
简介
lambda表达式是一个你只作为表达式传递的函数。lambda表达式有如下结构:{} 。它们是一种专门的语言结构,有助于在Kotlin中表示函数。
前提条件
在我们继续之前,必须具备以下条件。
- 对Kotlin编程语言有基本了解。
- IntelliJ IDEA或访问[Kotlin Playground]。
目录
- 什么是lambda表达式。
- lambda表达式的使用案例。
- 总结。
什么是Lambda表达式?
与Java不同,Kotlin中的函数是第一类。这意味着你可以把它们作为变量和数据结构来存储。你可以把它们作为参数传递,它们也可以是一个返回值。
既然你可以把它们作为变量存储,它们就必须有一个类型。Kotlin使用函数类型来表示它们。函数类型有以下结构。
(parameterType) -> returnType
作为函数类型的变量期待一个lambda表达式,如下所示。
-
val a:Int期待一个值,如 , 或 。1``23 -
val b:String期待一个值,如 或 。"string""name" -
val c:Boolean期待一个值,如 或 。truefalse
本着这种精神。
-
val d:() -> Int期待一个值,如 或{1}{2} -
val e:() -> String期待一个值,如 或{"string"}{"name"}
当我们引入参数时。
val f:(Int) -> String 期待一个值,如: 或{"string"} {"name"}
注意:你不一定要使用参数中传递的值。但你必须尊重返回类型并返回适当的值。
高阶函数是可以有lambda表达式传入的函数。它们也可以返回lambda表达式。
在处理所有的函数时,有3个主要步骤需要遵循。
第1步。创建函数:这涉及到给函数命名、参数和返回类型。
第2步。实现函数:这是你定义函数应该执行的任务的地方。
第3步。调用函数:这里你调用函数,并给它提供执行任务所需的参数。
注意:本文在函数式编程的背景下提到了函数。在面向对象编程中,你可以使用接口和抽象类。它们可以推迟函数的实现。之后,当你实现接口或继承类时,你可以覆盖该函数。
lambda表达式的一个使用案例
正则函数是在实现其功能的地方创建的。
看一下这个函数。
fun add(a:Int, b:Int){
val sum = a + b
println("The sum is $sum")
}
fun main(){
add(1,2)
}
该函数被创建,然后在lambda{ 之后添加了任务的实现。然后我们调用add 函数和main 函数。
output: The sum is 3
Lambda表达式是在一个地方创建的,但它们可以在其他地方实现其功能。
在下面的代码中,有2个函数需要跟踪。
add是一个高阶函数,因为它把 作为参数。printerprinter是我们的lambda表达式,它的类型是 。(Int)->Unit
在你的编辑器中对add 函数做如下修改。
fun add(a:Int, b:Int, printer:(Int) -> Unit){
val sum = a+b
printer(sum)
}
我们会注意到,在上面的代码中。
-
add已经创建并实现了一个正则函数的作用。它还没有在 函数中被调用。这使得 可以使用相同的实现来进行不同的调用。mainadd -
printer已被不同地处理。它被创建和调用,但它的实现还没有出现。它将在 函数中实现,因为我们调用 函数。main()add
在最后一步,将这段代码添加到你的主函数中。
fun main(){
add(2,4,{ value-> println("The sum is $value") })
add(3,5,{value-> println("The addition gives $value") })
}
在上面的代码中,我们通过高阶函数传入我们λ表达式的实现。我们也给传入lambda的参数命名为value 。这表明lambda表达式的实现可以很容易地改变。
预期的输出应该是。
The sum is 6
The addition gives 8
总结
lambda表达式允许你以不同的方式将函数视为变量。它们甚至允许你传递不同的操作作为函数的实现,就像你传递不同的值给一个变量一样。继续探索Lambda表达式的其他用例吧!