lazy 赖加载
Scala中使用关键字lazy来定义惰性变量,实现延迟加载(懒加载)。 惰性变量只能是不可变变量,并且只有在调用惰性变量时,才会去实例化这个变量。
我们看一下spark源码中的这段代码
/** Default properties present in the currently defined defaults file. */ lazy val defaultSparkProperties: HashMap[String, String] = { val defaultProperties = new HashMap[String, String]() if (verbose) SparkSubmit.printStream.println(s"Using properties file: $propertiesFile") Option(propertiesFile).foreach { filename => Utils.getPropertiesFromFile(filename).foreach { case (k, v) => if (k.startsWith("spark.")) { defaultProperties(k) = v if (verbose) SparkSubmit.printStream.println(s"Adding default property: $k=$v") } else { SparkSubmit.printWarning(s"Ignoring non-spark config property: $k=$v") } } } defaultProperties }
注意:lazy 修饰的是val变量(不可变)
实例:
class LazyTest() { lazy val aaa: mutable.HashMap[String, String] = { val value = new mutable.HashMap[String, String]() value.put("a", "b") value.put("c", "d") value.put("e", "f") value } def init: String = { println("aaa") return "" } } object LazyTest { def main(args: Array[String]): Unit = { lazy val value = new LazyTest().init // val value = new LazyTest().init println("bbb") value } }