在更高阶函数中使用参数/ s调用lambda

时间:2017-12-27 13:58:15

标签: java android functional-programming kotlin

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

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

怎么做?答案可能很简单,我只是没有找到它,在文档中只有列表的例子,如果答案很清楚:

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

2 个答案:

答案 0 :(得分:1)

这里你需要传递以Int作为参数并返回Boolean的函数。

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
}

答案 1 :(得分:1)

(Int) -> Boolean视为等同于以下接口(实际上,这实际上是在JVM上编译的内容):

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

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

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

fun lambdaTest(someMethod: Function<Int, Boolean>) {
    // 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<Int, Boolean>() {
    override fun invoke(param: Int): Boolean {
        println("Lambda called with number: $param")
        // Prints "Lambda called with number: 42"
        return param == 42
    }
})

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

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

这是lambda语法的等价物:

fun lambdaTest(someMethod: (Int) -> Boolean) {
    val isTheAnswerOfTheUniverse = someMethod(42)
}

fun main(args: Array<String>) {
    lambdaTest { param ->
        println("Lambda called with number: $param")
        // Prints "Lambda called with number: 42"

        // The result of the last expression is returned
        param == 42
    }
}
相关问题