1.带类型的参数化数组
val greetStrings= new Array[String](3)
其中Array[String]变量greetStrings的类型,3为实例初始化参数。
Scala里的数组是通过把索引放在圆括号里面访问的,而不是像Java那样放在方括号里。所以数组的第零个元素是greetStrings(0),不是greetStrings[0]。
Scala如何看待val的意义的重要概念。当你用val定义一个变量,那么这个变量就不能重新赋值,但它指向的对象却仍可以暗自改变。所以在本例中,你不能把greetStrings重新赋值成不同的数组;greetStrings将永远指向那个它被初始化时候指向的同一个Array[String]实例。但是你能一遍遍修改那个Array[String]的元素,因此数组本身是可变的。
2.不可变List
方法不应该有副作用是函数风格编程的一个很重要的理念。方法唯一的效果应该是计算并返回值。用这种方式工作的好处就是方法之间很少纠缠在一起,因此就更加可靠和可重用。另一个好处(静态类型语言里)是传入传出方法的所有东西都被类型检查器检查,因此逻辑错误会更有可能把自己表现为类型错误。把这个函数式编程的哲学应用到对象世界里意味着使对象不可变。
Scala的List,scala.List,不同于Java的java.util.List,总是不可变的(而Java的List可变)
当你在一个List上调用方法时,似乎这个名字指代的List看上去被改变了,而实际上它只是用新的值创建了一个List并返回。
比方说,List有个叫“:::”的方法实现叠加功能。你可以这么用:
val oneTwo = List(1, 2) val threeFour = List(3, 4) val oneTwoThreeFour = oneTwo ::: threeFour
List最常用的操作符是发音为“cons”的‘::’。Cons把一个新元素组合到已有List的最前端,然后返回结果List。例如:
val twoThree = List(2, 3) val oneTwoThree = 1 :: twoThree println(oneTwoThree)
注:不用写成new List因为“List.apply()”是被定义在scala.List伴生对象上的工厂方法(后面章节会介绍伴生对象)
由于定义空类的捷径是Nil,所以一种初始化新List的方法是把所有元素用cons操作符串起来,Nil作为最后一个元素。
val oneTwoThree = 1 :: 2 :: 3 :: Nil
Scala的List包装了很多有用的方法,具体的可以自己去查。
2个List比较相同可以用==去做比较。
3.元组(Tuple)
与列表一样,元组也是不可变的,但与列表不同,元组可以包含不同类型的元素。元组很有用,比方说,如果你需要在方法里返回多个对象。Java里你将经常创建一个JavaBean样子的类去装多个返回值,Scala里你可以简单地返回一个元组。
val pair = (99, "Luftballons") println(pair._1) println(pair._2)
注:尽管理论上你可以创建任意长度的元组,然而当前Scala库仅支持到Tupe22
4.可变和不可变Set、Map
上面介绍的数组是可变的,List是不可变的,而对于Set和Map,Scala提供了可变和不可变两种选择。
他们的简化名都是Set和Map,然而它们的全称不一样,因为每个都放在不同的包里,二者缺省定义都是不可变的。
如Set不可变的scala.collection.immutable.Set,可变的scala.collection.mutable.Set
import scala.collection.immutable.Map var jetSet = Set("Boeing", "Airbus")//这里定义的是不可变集 jetSet += "Lear" //因为是不可变集,所以这里的+=其实是重新赋值jetSet,所以jetSet要声明成var而不是val println(jetSet.contains("Cessna"))
要向集加入新的变量,可以在集上调用+,传入新的元素。可变的和不可变的集都提供了+方法,但它们的行为不同。可变集将把元素加入自身,不可变集将创建并返回一个包含了添加元素的新集。
Map和Set一样,Scala采用了类继承机制提供了可变的和不可变的两种版本的Map
import scala.collection.mutable.Map val treasureMap = Map[Int, String]()//定义一个可变的Map,因为是可变的,所以不需要对treasureMap 重新赋值,所以它是val treasureMap += (1 -> "Go to island.") treasureMap += (2 -> "Find big X on ground.") treasureMap += (3 -> "Dig.")