关于在简要学习Scala中的疑惑记录

在简要学习Scala的一些基本的使用,有一些学习上的感到疑惑的问题记录在此。

  • 调用方法时不加“.”一样可以,在方法最后不加“return”亦可,不过为了可读性,一般都是加的。

  • 在语句时常出现的“-”

其实这就是一种变量的简写。打个比方:

1
2
val a = Array(1, 2, 3, 4)
val b = a.map(_ * 2)

输出变量b:(2,4,6,8)

则易可知其中的语句val b = a.map(_ * 2)就相当于val b = a.map(a * 2)

  • 关于其中的lazy

详细可以参考此文章

如下打个比方:

lazy val property = initProperty()

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

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

可以再看看下面的利于理解:

1
2
3
4
5
6
7
8
9
10
11
12
13
object LazyOps {
def init(): String = {
println("call init()")
return ""
}
def main(args: Array[String]) {
val property = init();//没有使用lazy修饰
println("after init()")
println(property)
}
}

上面的property没有使用lazy关键字进行修饰,所以property是立即实例化的,如果观察程序的输出:

1
2
3
call i nit()
after init()

可以发现,property声明时,立即进行实例化,调用了init()`实例化方法

而如果使用lazy关键字进行修饰:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
object LazyOps {
def init(): String = {
println("call init()")
return ""
}
def main(args: Array[String]) {
lazy val property = init();//使用lazy修饰
println("after init()")
println(property)
println(property)
}
}

观察输出:

1
2
3
after init()
call init()

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

  • Scala中的break可用return替代。

暂时这么多,以后再补充。

---------------本文终---------------

文章作者:刘俊

最后更新:2019年01月02日 - 15:01

许可协议: 转载请保留原文链接及作者。