有人可以为我解释以下“科特林文字高阶函数”的实现吗?

时间:2019-06-21 08:55:28

标签: kotlin

我是Kotlin的新手,我才刚开始学习它, 我得到以下有关文字/高阶函数的代码示例:

fun myHigherOrderFun(functionArg: (Int)->String) = functionArg(5)
println ( myHigherOrderFun { "The Number is $it" })
prints "The Number is 5"

我很难理解:函数myHigherOrderFun获得一个lambda函数作为参数,但是我不明白,(Int)输入参数在哪里?我看到在functionArg(5)中传递了...但是我不知道那怎么可能?

谢谢。

1 个答案:

答案 0 :(得分:0)

从一开始,Kotlin中的函数是一流的类型,就像数字和字符串之类的东西。因此,一个函数可以将另一个函数作为参数,和/或返回一个函数作为其结果。执行此操作的函数称为“高阶函数”。

这就是您的示例中的内容!该行:

fun myHigherOrderFun(functionArg: (Int)->String) = functionArg(5)

myHigherOrderFun()定义为带有一个参数的函数,它本身就是一个具有单个Int参数并返回String的函数。 (myHigherOrderFun()没有指定显式的返回类型,因此也可以推断为String。)

下一行可能是不太清楚的地方:

println(myHigherOrderFun{ "The Number is $it" })

第一个不明显的事情是它使用参数调用myHigherOrderFun()。由于该参数是lambda,因此Kotlin允许您省略通常的(),而只使用花括号。

另一个不明显的是lambda本身:{ "The Number is $it" }。这是一个带一个参数(未指定类型)的文字函数。

通常,您必须明确指定任何参数,例如:{ a: Char, b: Int -> /* … */ }。但是,如果只有一个参数,而您没有指定其类型,则可以跳过该参数,而只需将参数称为it。这就是这里发生的事情。

(如果lambda没有引用it,那么它将是一个完全不带参数的函数。)

并且由于将lambda传递给期望带有Int参数的函数,因此Kotlin知道it必须是Int,这就是为什么我们不用指定就可以逃脱的原因那个。

因此,科特林将那个lambda传递给myHigherOrderFun(),后者执行lambda,将5作为it传递。它将其插入一个字符串中,并作为println()的参数返回。

许多lambda都使用一个参数,因此it在Kotlin中的使用率很高;它比替代方法更简洁(通常更具可读性)。有关更多信息,请参见the docs