📜  在 Kotlin 中使用匿名函数

📅  最后修改于: 2022-05-13 01:54:34.174000             🧑  作者: Mango

在 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 )。它可以是表达式或代码块。