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")
}
我最近偶然发现了在Kotlin中调用函数的语法,我只是不明白它: 第一个选项是明确的 - 它是一个lambda,但第二个看起来不像通常使用所需参数调用函数的语法。通常params应该放置的括号是空的,而函数参数则来自调用者的主体!怎么可能,需要什么呢?
答案 0 :(得分:3)
这是传递lambda的另一种有效方法。根据{{3}}:
在Kotlin中,有一个约定,如果函数的最后一个参数是一个函数,并且您将lambda表达式作为相应的参数传递,则可以在括号外指定它:
lock (lock) {
sharedResource.operation()
}
您可以选择自己喜欢的方法。
答案 1 :(得分: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保持在函数的最后位置。