首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Kotlin中,这个代码“懒惰”意味着什么?

在Kotlin中,这个代码“懒惰”意味着什么?
EN

Stack Overflow用户
提问于 2020-06-21 13:29:54
回答 1查看 785关注 0票数 1

这条代码行在做什么?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun<T:x>a.b(y: Int)=lazy{u.v<T>(y)}

我不知道什么是“懒惰”做的,或者是“懒惰”的东西,在科特林。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-21 15:12:14

funa.b(y: Int)=惰性{U.V(Y)}

让我们把这个拆开。首先,让我们为可读性重新格式化:)

fun <T: x> a.b(y: Int) = lazy { u.v<T>(y) }

现在,让我们一片片地去。

fun意味着我们要声明一个新方法。

<T:x>意味着这是一个在T类型上操作的泛型方法,其中T受约束,属于x类型。

a.b意味着这是一个名为ba类型。

(y: Int)意味着定义的函数b接受一个名为Int类型的y的参数。

=表达式体语法 --用于返回短代码行的缩写。这意味着a.b将返回计算lazy { }的结果的值。

lazyKotlin标准库函数,它将提供给它的函数的评估延迟到需要时,然后缓存结果。此函数的返回值实际上是包装所提供函数的类型Lazy

{ u.v<T>(y) }Lazy对象第一次获得值时将执行的函数,u.v<T>(y)的返回值将保存为惰性对象的value

呼!那这是什么意思?让我们看一个例子。假设我们向函数中添加了一个print语句,以查看何时调用它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun <T: x> a.b(y: Int) = lazy {
  println("Executing 'b'")
  u.v<T>(y)
}

现在,如果你试图使用它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)  
}

因此,总之,您发布的代码正在创建一个扩展方法,该方法返回一个Lazy对象,当查询其值时,该对象执行它被初始化的lambda并缓存以供以后使用。

希望这能帮上忙!

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62504655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文