在高阶函数中调用具有参数/ s的lambda

我是java / kotlin函数式编程的新手,并做了一些练习。 只是想知道如何在调用lambda时传递参数。 例如,在这里调用someMethod我需要传递一个Int参数。

fun lambdaTest( someMethod: (Int) -> Boolean){ someMethod() } 

如何做到这一点? 答案可能非常简单,我只是没有在任何地方find它,在文档中只有列表的例子,如果答案是明确的:

 fun  List.map(transform: (T) -> R): List { val result = arrayListOf() for (item in this) result.add(transform(item)) return result } 

在这里你需要传递以int为参数的函数并返回布尔值。

 lambdaTest { int -> int > 0 // can be also changed to it } 

如果Int参数大于0,则返回true。

如果你想要更多的参数:

 fun lambdaTest( someMethod: (Int, String) -> Unit){ // Unit means do not return anything someMethod(1, "Kotlin") } 

并称之为:

 lambdaTest { int, string -> println("Passed Int: $int, and String: $string as parameter") // Output = Passed Int: 1, and String: Kotlin as parameter } 

(Int) -> Boolean看作等同于下面的接口(实际上,这实际上就是JVM上编译的东西):

 interface Function { fun inkoke(param: I): O } 

I是输入参数的types, O是输出types的types(返回值)。

Kotlin中的所有lambda实际上都是用一个给定数量的参数和返回typesinvoke单个方法来定义对象的简写语法。 考虑到这一点,我们重写你的高阶函数。

 fun lambdaTest(someMethod: Function) { // Call invoke with an Int paramater. This returns a Boolean. val isTheAnswerOfTheUniverse = someMethod.invoke(42) } 

现在我们调用这个方法:

 // We can pass an anonymous class as the parameter lambdaTest(object : Function() { override fun invoke(param: Int): Boolean { println("Lambda called with number: $param") // Prints "Lambda called with number: 42" return param == 42 } }) 

这与(Int) -> Boolean是相同的。 唯一的区别是语法:由于Kotlin也是一种function性语言,它提供了语法糖来提高可读性并减少样板,例如

  • 将函数定义为variables的专用语法
  • .invoke可以省略(因为它是一个运算符超载 )
  • 一个用于定义lambda的专用语法,就像Java 8一样(Kotlin使用大括号)。
  • 如果lambda是高阶函数的最后一个参数,那么可以在括号外表示lambda。

这里是lambda语法的等价物:

 fun lambdaTest(someMethod: (Int) -> Boolean) { val isTheAnswerOfTheUniverse = someMethod(42) } fun main(args: Array) { lambdaTest { param -> println("Lambda called with number: $param") // Prints "Lambda called with number: 42" // The result of the last expression is returned param == 42 } }