我是Kotlin的新手,我才刚开始学习它, 我得到以下有关文字/高阶函数的代码示例:
fun myHigherOrderFun(functionArg: (Int)->String) = functionArg(5)
println ( myHigherOrderFun { "The Number is $it" })
prints "The Number is 5"
我很难理解:函数myHigherOrderFun获得一个lambda函数作为参数,但是我不明白,(Int)输入参数在哪里?我看到在functionArg(5)中传递了...但是我不知道那怎么可能?
谢谢。
答案 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。