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 上运行的通用方法,其中 Tconstrained 类型 x.

a.b 表示这是一个名为 bextension function,类型为 a

(y: Int) 表示定义的函数 b 接受一个名为 y 且类型为 Int.

的参数

=expression body syntax - shorthand 用于 return 一小段代码。这意味着 a.b 将 return 计算 lazy { }

的结果值

lazya 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 并缓存结果供以后使用。

希望对您有所帮助!