1. var & val
var 变量,可变
val 类似常量,不可变
2. map/reduce
val list = List(1,2,3,4,5,6) list.map( f => println(s"val: $f") ) // val:1 xxx val:6 val sum = list.reduce( (sum, n) => sum+n ) // 21
3. 泛型
scala泛型设计太过复杂,泛型支持多个奇怪的操作符,如:<: >: <% T:class T:Ordering
3.1 上下边界 <: >:
A <: B A是B的子类
// 基类 class Person(val name: String) { def talk(person: Person){ println(this.name + " talk to " + person.name) } } // 派生类 class Worker(name: String) extends Person(name) // 普通类 class Dog(val name: String) /** * 泛型为[] * <: 上边界,指明本身及派生类 */ class Club1[T <: Person](p1: T, p2: T){ def communicate = p1.talk(p2) } // 测试代码 val p = new Person("Spark") val w = new Worker("Scala") new Club1(p, w).communicate // 无参调用可省略(),输出: Spark talk to Scala
3.2 view bound <%
A <% B A可以转化B,需要一个隐式转换函数。
// <% class Club2[T <% Person](p1: T, p2: T){ def communicate = p1.talk(p2) } // 隐式转换函数 implicit def dog2Person(dog: Dog) = new Person(dog.name) val d = new Dog("Dog") new Club2[Person](p, w).communicate // 对象擦除至Object,需[object]强转。 输出:Spark talk to dog
3.3 逆变和协变 +T -T
+T Container[A]是Container[B]的子类
// Earth class Earth { def sound(){ println("Hello") } } // Animal class Animal extends Earth{ override def sound() = { println("Animal sound") } } // Bird class Bird extends Animal{ override def sound() = { println("Bird sound") } } // Container class Space[+T] { println("Hello space") } // 测试代码 var a = new Space[Animal] a = new Space[Bird] // Bird为Animal子类,ok // a = new Space[Earth] // Earth为父类,error
输出:
hello space
hello space