当前位置: 首页 > news >正文

Scala学习之路 (五)Scala的关键字Lazy

Scala中使用关键字lazy来定义惰性变量,实现延迟加载(懒加载)。 
惰性变量只能是不可变变量,并且只有在调用惰性变量时,才会去实例化这个变量。

在Java中,要实现延迟加载(懒加载),需要自己手动实现。一般的做法是这样的:

public class JavaLazyDemo {
    private String name;

    //初始化姓名为huangbo
    private String initName(){
        return "huangbo";
    }

    public String getName(){
        //如果name为空,进行初始化
        if(name == null){
            name = initName();
        }
        return  name;
    }

}

在Scala中对延迟加载这一特性提供了语法级别的支持:

lazy val name = initName()

使用lazy关键字修饰变量后,只有在使用该变量时,才会调用其实例化方法。也就是说在定义property=initProperty()时并不会调用initProperty()方法,只有在后面的代码中使用变量property时才会调用initProperty()方法。

如果不使用lazy关键字对变量修饰,那么变量property是立即实例化的:

object ScalaLazyDemo {
  def init():String = {
    println("huangbo 666")
    return "huangbo"
  }

  def main(args: Array[String]): Unit = {
    val name = init();
    println("666")
    println(name)
  }
}

上面的property没有使用lazy关键字进行修饰,所以property是立即实例化的,调用了initName()方法进行实例化。

使用Lazy进行修饰

object ScalaLazyDemo {
  def init():String = {
    println("huangbo 666")
    return "huangbo"
  }

  def main(args: Array[String]): Unit = {
    lazy val name = init();
    println("666")
    println(name)
  }
}

在声明name时,并没有立即调用实例化方法initName(),而是在使用name时,才会调用实例化方法,并且无论缩少次调用,实例化方法只会执行一次。

 

相关文章:

  • ListView封装实现下拉刷新和上拉加载
  • 搜狗旅行翻译宝亮相香港环球资源电子展 AI翻译成全场最大亮点
  • 43.AzureVM复制到另一个Azure区域
  • 如何在虚拟机中访问真机的虚拟域名
  • java中的hashCode
  • Hive连接?
  • 20165334 《java程序设计》第8周学习总结
  • Redis4.0 单节点集群到三主三从节点集群实验
  • 基于面向对象编程的设计模式
  • 查询是否sci或者ei收录
  • 直接写position:absolute,后面不加top和left等值,是什么意思?分两种情况
  • 创建镜像iso文件
  • 深入理解HashMap底层原理剖析(JDK1.8)
  • 软件测试--测试用例
  • 【vuejs深入二】vue源码解析之一,基础源码结构和htmlParse解析器
  • 深入了解以太坊
  • “大数据应用场景”之隔壁老王(连载四)
  • 【Amaple教程】5. 插件
  • 5、React组件事件详解
  • Angular 响应式表单之下拉框
  • Javascript基础之Array数组API
  • JS基础之数据类型、对象、原型、原型链、继承
  • js写一个简单的选项卡
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Redis学习笔记 - pipline(流水线、管道)
  • springMvc学习笔记(2)
  • SSH 免密登录
  • tweak 支持第三方库
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 闭包--闭包之tab栏切换(四)
  • 测试开发系类之接口自动化测试
  • 对超线程几个不同角度的解释
  • 计算机在识别图像时“看到”了什么?
  • 技术发展面试
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 你真的知道 == 和 equals 的区别吗?
  • 删除表内多余的重复数据
  • 算法之不定期更新(一)(2018-04-12)
  • 移动端解决方案学习记录
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (未解决)macOS matplotlib 中文是方框
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • @html.ActionLink的几种参数格式
  • @JoinTable会自动删除关联表的数据
  • @vue/cli 3.x+引入jQuery
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析