2017-07-19 145 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在最后位置你的功能离子。