Kotlin 中这段代码的 "lazy" 是什么意思?
What does "lazy" mean with this code in Kotlin?
这行代码在做什么?
fun<T:x>a.b(y: Int)=lazy{u.v<T>(y)}
我不知道 'lazy' 在做什么,或者 'lazy' Kotlin 有什么特别之处。
fun<T:x>a.b(y: Int)=lazy{u.v(y)}
我们来分解一下。首先,让我们重新格式化以提高可读性:)
fun <T: x> a.b(y: Int) = lazy { u.v<T>(y) }
现在,让我们一块一块地来。
fun
表示我们正在声明一个新方法。
<T:x>
表示这是在类型 T
上运行的通用方法,其中 T
是 constrained 类型 x
.
a.b
表示这是一个名为 b
的 extension function,类型为 a
。
(y: Int)
表示定义的函数 b
接受一个名为 y
且类型为 Int
.
的参数
=
是 expression body syntax - shorthand 用于 return 一小段代码。这意味着 a.b
将 return 计算 lazy { }
的结果值
lazy
是 a Kotlin standard library function 延迟提供给它的函数的评估,直到需要它,然后缓存结果。这个函数的 return 值实际上是一个类型 Lazy
包装了提供的函数。
{ u.v<T>(y) }
是Lazy
对象第一次获取它的值时执行的函数,u.v<T>(y)
的return值会被保存作为惰性对象的 value
.
呸!那是什么意思呢?让我们看一个例子。假设我们在函数中加入打印语句,看看什么时候被调用。
fun <T: x> a.b(y: Int) = lazy {
println("Executing 'b'")
u.v<T>(y)
}
现在,如果您尝试使用它:
fun main() {
val a = A<T>() // Assume some type T
val lazyObject = a.b<T>(42) // Call the extension method that returns a `Lazy`
// Get the value from the lazy object - prints "Executing 'b'",
// executes `u.v<T>(y)`, caches the result, returns it - then print it
println(lazyObject.value)
// Get the value from the lazy object again. This time, DOES NOT print
// "Executing 'b'", DOES NOT execute `u.v<T>(y)`, and just returns the
// result that was already computed and cached, then print it
println(lazyObject.value)
}
因此,总而言之,您发布的代码正在创建一个 extension 方法,该方法 return 是一个 Lazy
对象,当查询其值时,执行它初始化的 lambda 并缓存结果供以后使用。
希望对您有所帮助!
这行代码在做什么?
fun<T:x>a.b(y: Int)=lazy{u.v<T>(y)}
我不知道 'lazy' 在做什么,或者 'lazy' Kotlin 有什么特别之处。
fun<T:x>a.b(y: Int)=lazy{u.v(y)}
我们来分解一下。首先,让我们重新格式化以提高可读性:)
fun <T: x> a.b(y: Int) = lazy { u.v<T>(y) }
现在,让我们一块一块地来。
fun
表示我们正在声明一个新方法。
<T:x>
表示这是在类型 T
上运行的通用方法,其中 T
是 constrained 类型 x
.
a.b
表示这是一个名为 b
的 extension function,类型为 a
。
(y: Int)
表示定义的函数 b
接受一个名为 y
且类型为 Int
.
=
是 expression body syntax - shorthand 用于 return 一小段代码。这意味着 a.b
将 return 计算 lazy { }
lazy
是 a Kotlin standard library function 延迟提供给它的函数的评估,直到需要它,然后缓存结果。这个函数的 return 值实际上是一个类型 Lazy
包装了提供的函数。
{ u.v<T>(y) }
是Lazy
对象第一次获取它的值时执行的函数,u.v<T>(y)
的return值会被保存作为惰性对象的 value
.
呸!那是什么意思呢?让我们看一个例子。假设我们在函数中加入打印语句,看看什么时候被调用。
fun <T: x> a.b(y: Int) = lazy {
println("Executing 'b'")
u.v<T>(y)
}
现在,如果您尝试使用它:
fun main() {
val a = A<T>() // Assume some type T
val lazyObject = a.b<T>(42) // Call the extension method that returns a `Lazy`
// Get the value from the lazy object - prints "Executing 'b'",
// executes `u.v<T>(y)`, caches the result, returns it - then print it
println(lazyObject.value)
// Get the value from the lazy object again. This time, DOES NOT print
// "Executing 'b'", DOES NOT execute `u.v<T>(y)`, and just returns the
// result that was already computed and cached, then print it
println(lazyObject.value)
}
因此,总而言之,您发布的代码正在创建一个 extension 方法,该方法 return 是一个 Lazy
对象,当查询其值时,执行它初始化的 lambda 并缓存结果供以后使用。
希望对您有所帮助!