2017-07-19 164 views
0
fun lazyProperty(initializer:() -> Int): Int {     
    val result: Lazy<Int> = lazy(initializer) 
    return result.value     
}     

fun main(args: Array<String>) {     
    // 1. 
    val bar: Int = lazyProperty({ 1 + 1 }) 
    // 2. 
    val foo: Int = lazyProperty() { 
    42 
    } 

    println("bar $bar, foo: $foo") 
} 

我最近偶然在調用科特林函數的語法,我只是不明白這一點的身體機能,PARAM實現: 拳頭的選擇是明確的 - 這是一個拉姆達但第二個看起來不像使用必需參數調用函數的通常語法。通常應該放置params的括號是空的,取而代之的是函數參數來自調用者的主體!這怎麼可能?它需要什麼?科特林:在主叫

回答

3

這是傳遞lambda的另一種有效方法。按照docs

在科特林,有一個慣例,如果一個函數的最後一個參數是一個函數,而你傳遞一個lambda表達式爲相應的參數,你可以括號外指定它:

lock (lock) { 
    sharedResource.operation() 
} 

您可以選擇任何接近你喜歡。

+3

另請注意,如果一個函數只有一個函數參數,則括號可以省略:'lazyProperty {42}' – hotkey

1

這只是約定。如果函數的最後一個參數是一個函數,則可以將圓括號之外的lambda傳遞給函數。在你的情況下,你有以下選擇:

val bar: Int = lazyProperty({ 1 + 1 }) 
val bar: Int = lazyProperty() { 1 + 1 } 
val bar: Int = lazyProperty { 1 + 1 } 

所有三個選項是相同的。


如果你的函數將有第二個參數(在第一位置),比調用看起來是這樣的:

fun lazyProperty(x: Int, initializer:() -> Int): Int {...} 

val bar: Int = lazyProperty(7, { 1 + 1 }) 
val bar: Int = lazyProperty(7) { 1 + 1 } 

如果你的函數將有第二個參數(在第二位置),比呼叫看起來像這樣:

fun lazyProperty(initializer:() -> Int, x: Int): Int {...} 

val bar: Int = lazyProperty({ 1 + 1 }, 7) 

因此,總是試圖保持Lambda在最後位置你的功能離子。