2017-12-27 348 views
1

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

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 
} 

回答

1

在这里,你需要传递函数,它Int作为参数并返回布尔值。

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 
} 
+0

谢谢!你的答案清除了一切。 – sunflower20

1

思考的(Int) -> Boolean

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

这里如果诠释参数高于0.1

如果你想要更多的参数,我们返回true相当于下面的接口(实际上,这实际上是在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相同。唯一的区别是语法:作为科特林也是功能性的语言,它提供了语法糖,以提高可读性和减少样板,如

  • 的专用语法用于定义用作可变
  • .invoke可以省略(因为它是一个)
  • 一个用于定义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 
    } 
} 
+0

您的类型看起来不对。您将lambdaTest定义为期望类型为(Int) - > Boolean的函数,但是您可以使用类型为(Somehing) - > Unit的参数在main中调用它。有些东西(你的参数)可以被解释为Int,所以你的参数匹配(Int) - > Unit,但是你的println()当然不能被解释为布尔值(只能作为一个Unit)。 – Ekeko

+0

你是完全正确的!感谢您的反馈。 –