scala> val a = 1
a: Int = 1

scala> lazy val b = 1
b: Int = <lazy>            // 不会马上计算赋值

scala> b                   // 当使用的时候,才会计算赋值
res0: Int = 1

场景演示

使用 fromFile 必须先导入包

scala> import scala.io.Source._
import scala.io.Source._

直接读取文件,默认把内容直接赋值给 res3 变量

scala> fromFile("/root/scala/HelloWorld.scala").mkString
res3: String =
"object HelloWorld{
        def main(args : Array[String]){
                println("hello World...");
        }
}
"

直接赋值给 info 变量

scala> val info = fromFile("/root/scala/HelloWorld.scala").mkString
info: String =
"object HelloWorld{
        def main(args : Array[String]){
                println("hello World...");
        }
}
"

使用 lazy,不会马上加载内容到 info 变量
使用他的时候才会加载

scala> lazy  val info = fromFile("/root/scala/HelloWorld.scala").mkString
info: String = <lazy>

scala> info
res4: String =
"object HelloWorld{
        def main(args : Array[String]){
                println("hello World...");
        }
}
"

如果我们故意把加载路径写错,使用 lazy 的时候,只有到使用这个变量了,才会报错

scala> lazy  val info = fromFile("/root/scala/HelloWorld.scala1").mkString
info: String = <lazy>

scala> info
java.io.FileNotFoundException: /root/scala/HelloWorld.scala1 (No such file or directory)
  at java.io.FileInputStream.open0(Native Method)
  at java.io.FileInputStream.open(FileInputStream.java:195)
  at java.io.FileInputStream.<init>(FileInputStream.java:138)
  at scala.io.Source$.fromFile(Source.scala:91)
  at scala.io.Source$.fromFile(Source.scala:76)
  at scala.io.Source$.fromFile(Source.scala:54)
  at .info$lzycompute(<console>:14)
  at .info(<console>:14)
  ... 32 elided