在 Kotlin 中使用匿名函数
在 Kotlin 中,我们可以通过创建 lambda 来将函数作为表达式。 Lambda 是函数字面量,也就是说,它们没有被声明为表达式,并且可以作为参数传递。但是,我们不能在 lambdas 中声明返回类型。尽管在大多数情况下 Kotlin 编译器会自动推断返回类型,但对于无法自行推断或需要显式声明的情况,我们使用匿名函数。在本文中,我们将了解如何使用匿名函数。在此之前,我们有一些:
本文的先决条件:
- Kotlin 中的函数
这些的基本思想:
- Lambda 表达式(这是一种定义函数的简短方法。)
- 匿名函数(它是定义函数的另一种方法。)
参考这篇文章:Lambdas 表达式和匿名函数
例子
我们将借助一些示例逐步了解匿名函数:
让我们首先将函数声明为 lambda:
Kotlin
fun main(args: Array){
val funMultiply = {a : Int, b : Int-> a * b}
printIn(funMultiply(6,4))
val funSayHi = {name : String->println("Hi $name")}
funSayHi("geek")
}
Kotlin
fun main (args: Array){
var funMultiply = fun (a: Int, b: Int) : Int {return a*b}
printin (funMultiply (6,4))
fun (name : String) : Unit = println ("Hi $name")
}
Kotlin
fun main (args: Array){
var funMultiply = fun(a: Int, b: Int) : Int { return a*b }
var funSum = fun(a: Int, b: Int) : Int { return a+b }
performMath (6, 4, funMultiply)
performMath (6, 4, funSum)
}
fun performMath (a : Int, b: Int, mathFun : (Int, Int) -> Int) : Unit
{
printIn ( "Value of calculation: ${mathFun(a, b)}")
}
Kotlin
fun main (args: Array) {
performMath (6,4, fun (a: Int, b: Int) : Int = a*b )
performMath (6,4, fun (a: Int, b: Int) : Int = a+b )
}
fun performMath (a : Int, b: Int, mathFun : (Int, Int) -> Int) : Unit
{
println ("final value: ${mathFun(a,b)}")
}
在前面的代码块中,我们声明了两个 lambda:一个 (funMultiply) 接受两个整数并返回一个整数,另一个 (funSayHi) lambda 接受一个字符串并返回一个单位——也就是说,它什么也不返回。尽管在前面的示例中我们不需要声明参数类型和返回类型,但在某些情况下我们需要显式声明参数类型和返回类型。我们通过匿名函数以下列方式做到这一点:
科特林
fun main (args: Array){
var funMultiply = fun (a: Int, b: Int) : Int {return a*b}
printin (funMultiply (6,4))
fun (name : String) : Unit = println ("Hi $name")
}
所以现在我们对匿名函数的工作原理有了一个大致的了解。现在,让我们尝试在另一个函数中传递一个——也就是说,我们将尝试一个高阶函数。查看此代码段:
科特林
fun main (args: Array){
var funMultiply = fun(a: Int, b: Int) : Int { return a*b }
var funSum = fun(a: Int, b: Int) : Int { return a+b }
performMath (6, 4, funMultiply)
performMath (6, 4, funSum)
}
fun performMath (a : Int, b: Int, mathFun : (Int, Int) -> Int) : Unit
{
printIn ( "Value of calculation: ${mathFun(a, b)}")
}
所以基本上,匿名函数的声明就像普通函数一样,但没有名称。主体可以是一个表达式,如下例所示,也可以是一个块,如前例所示。需要注意的一点是,在匿名函数的情况下,参数总是在括号内传递,这与 lambda 表达式不同:
科特林
fun main (args: Array) {
performMath (6,4, fun (a: Int, b: Int) : Int = a*b )
performMath (6,4, fun (a: Int, b: Int) : Int = a+b )
}
fun performMath (a : Int, b: Int, mathFun : (Int, Int) -> Int) : Unit
{
println ("final value: ${mathFun(a,b)}")
}
- lambda 和匿名函数之间另一个有趣的区别是,在 lambda 中,return 语句从封闭函数返回,而在匿名函数中,它只是从函数本身返回。
- 如果可以自行推断,也可以省略匿名函数的参数类型和返回类型。
- 匿名函数可以访问和修改其闭包内的变量。
因此,基本上,可以像没有名称的常规函数一样声明匿名函数(因此,名称为 anonymous )。它可以是表达式或代码块。