开门见山,Scala是真心的复杂、难学,但学着上瘾。因为它有太多吸引人的特性,超传统Java好几条街,即使Java 8也赶不上。(一点题外话,现在Java语言本身的特性,甚至连C++1x的也赶不上,发展的太慢,没有创新)。
简单说说有哪些有趣的特性。
强类型语言
这算不上什么特性,只是某种理念,但我觉得非常重要。类型安全的语言让人写起来的放心,日后也更容易维护。
函数对象
Scala本身是一门FP语言,函数的地位是第一位,非常简单就可定义函数,且函数可以做为对象传递给其他函数或由其他函数生成,非常方便,不再需要提前定义接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
type MyType = (Int, Int) => Int type MyType2 = (Int) => Int def myFunc(a: Int, b: Int = 2) : Int = { b * a } def useMyFunc(a:Int, func: MyType2 = null) = { if (func != null) { 2 * func(a) } else { 2 * a } } def createFunc(a: Int): MyType2 = { myFunc(_, a) } println(useMyFunc(2)) println(useMyFunc(2, myFunc(_, 2))) println(useMyFunc(2, createFunc(9))) |
相当强大的灵活性吧。这个例子还展示了一些特性
- 函数的参数可以有默认参数,再不用多个函数重载版本
- 使用type定义类型的别名,很像C++11里的using
Match Expression
首先把它理解成表达式,不是简单的流程控制。这个特性比switch..case强大太多了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
val status = 200 val message = status match { case 200 => "ok" case 400 => "error" case 500 => { println("do something") "error" } case _ => { // do something } } |
这部分的语法还真是挺复杂的,有兴趣的找找Tutorial学习一下,不在这里一一展示了。
Objects, Case Classes, Traits
面向对象方面,除了传统的Java特性之外,还新添加了几个新的成员。
- Object就是JVM上的一种单例实现,Lazy initialization。
- Case Class可以看成一种语法糖,可以生成Instantiable的类,并自动生成一些常用的函数,如apply(), copy(), equals()等。
- Trait则是为多继承准备的。从OO的角度看,多继承是完全合情合理的,只是实现上会有很多问题,所以设计从语言层面去掉了这种可能。
此外Scala还有很多的特性和超多的语法糖,以后慢慢再续上。