2017-12-27 351 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

你是完全正確的!感謝您的反饋。 –