Kotlin:调用者体内的函数参数实现
fun lazyProperty(initializer: () -> Int): Int { val result: Lazy = lazy(initializer) return result.value } fun main(args: Array) { // 1. val bar: Int = lazyProperty({ 1 + 1 }) // 2. val foo: Int = lazyProperty() { 42 } println("bar $bar, foo: $foo") }
我最近偶然发现了在Kotlin中调用一个函数的语法,我只是不明白:第一个选项是清晰的 – 这是一个lambda,但是第二个看起来不像通常的调用具有所需参数的函数的语法。 通常应该放置params的括号是空的,而函数参数来自调用者的主体! 这怎么可能,需要什么?
这是传递lambda的另一种有效方法。 根据文件 :
在Kotlin中,有一个约定,如果函数的最后一个参数是一个函数,并且将一个lambdaexpression式作为相应的parameter passing,则可以在括号外指定它:
lock (lock) { sharedResource.operation() }
您可以选择任何您喜欢的方法。
这只是惯例。 如果一个函数的最后一个参数是一个函数,那么可以将括号外的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在你函数的最后位置。
- Android Kotlin Dagger2提供了gson:指定为非null的参数为null
- 用kotlin spek和kluent运行测试
- 如何使用Android Room Persistence Library将Column注释为NOT NULL
- 在Kotlin支持棒棒糖
- 我怎样才能让我的JUnit测试在我的Kotlin + Gradle项目中编译和运行?
- 什么是Java Stream.collect的Kotlin等价物?
- Kotlin泛型:Kotlin不承认我的类具有正确的继承
- 将程序风格方法转换为功能风格
- 使用Android数据绑定在Kotlin中初始化RecyclerView会引发错误。 我究竟做错了什么?