scala 系列之 06scala 懒加载 lazy

教程 潘牛 ⋅ 于 2021-07-08 22:46:53 ⋅ 1774 阅读

7 懒加载 lazy

惰性变量用法放在不可变变量之前;

只有在调用惰性变量时才会去实例化这个变量,类似于java中单例模式的懒汉模式;

作用:是将推迟复杂的计算,直到需要计算的时候才计算,而如果不使用,则完全不会进行计算。

//没有lazy关键字的时候
object LazyDemo {
  def init():Unit = {
    println("init")
  }
  def main(args: Array[String]): Unit = {
    val p = init()       
    println("init after")
    println(p)
    println(p)
  }
}
// ---输出结果---
init
init after
()
()

// 带有lazy关键字的变量
object LazyDemo2{
  def init():Unit = {
    println("init")
  }
  def main(args: Array[String]): Unit = {
    // 只有在使用该变量时,才初始化,而且只初始化一次
    lazy val p = init()        
    println("init after")
    println(p)
    println(p)
  }
}
// ---输出结果---
init after
init
()
()

通过反编译工具查看后发现

不带有 lazy 关键字:

file
**

file
**

带有lazy关键字

file
**

file
**

总结:

​ 对于这样一个表达式: lazy val t:T = expr 无论expr是什么东西,字面量也好,方法调用也好。Scala的编译器都会把这个expr包在一个方法中,并且生成一个flag来决定只在它第一次被访问时才调用该方法。

版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海汼部落-潘牛,http://hainiubl.com/topics/75741
成为第一个点赞的人吧 :bowtie:
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter