在之前的工作和学习中并没有接触过scala。粗粗接触,感觉至少在语法上scala让我很不适应。 然而,所有我看到过的关于scala的书和一些网络资料上说,scala诡异的语法(至少在我目前看来是诡异的)正是出于对代码简洁的考虑。
简洁的scala
scala简洁吗?scala被认为有很高的代码密度,键入更少获得更多。
接下来以java和sacla的一些小例子对比着看scala是不是真的简洁吧:
java代码
public static void main(String[] args) {
for(int i = 0 ;i <= 3;i++){
System.out.println(i);
}
}
相同功能的scala代码
scala code
def main(agrs:Array[String]){
for (i <- 1 to 3){
println(i)
}
}
两个程序都是在主方法中写了一个for循环,打印了3个数,语法上和java是不是差别很大呢?
scala与java相比打印语句没有任何累赘的东西;分号一般是可选的,只有当需要避免一些语法上的歧义时才必须键入;变量没有必要指定类型,她通过类型推演来获得变量的真实类型;对于一些简单的代码可以不放到类中,这些都与java对比鲜明,有人说当使用java时,也许你想要的只是香蕉,但是你得到的是一个拿着香蕉的大猩猩。
scala的循环是轻量级的,只要说明变量i的取值范围即可。理解scala的for循环我们借助一下称为可以执行的伪代码的python代码:
for i in range(1,4):
println i
上面这段python代码和之前的两段代码运行结果是一样的,可见scala中的”<-"与python中的"in"的作用是相同的,1 to 3和range(1,4)的作用是一样的都是用来当做生成器表达式,实际上scala中确实也有这样的写法。
为了"键入更少获得更多"上面的scala代码还悄悄做了一些事情,我们来看下面这段代码
<pre name="code" class="plain">scala code
def main(agrs:Array[String]){
for (i <- 1.to(3)){
println(i)
}
}
原来形如1 to 3竟然是方法调用,只是scala将方法调用时的“.”和括号省略了。然而“.”和括号不是完全不需要的,只有当方法只有0或者1个参数时调用方法才可以省略。
不仅如此,scala还做了更多,但是要讨论scala还做了哪些事之前,我们先学习下val和var的知识,在scala中var和val都可以用来定义变量,不同之处在于,使用val定义的变量时不可变得,这里所说的不变是指变量本身不变,而不是变量引用的实例。在scala中建议尽量使用val,这样可以保证不变性,要知道scala是用来处理并发的这点很重要。
知道var和val后可能想知道上面循环中的i是可变还是不可变的呢?答案是不可变得,每次循环都重新创建i并赋值,这保证了我们不会因为疏忽将i的值改变,这也说明scala在i处理成用val声明,然而这对于我们来说是透明的。