1.带类型的参数化数组 前端
val greetStrings= new Array[String](3)
其中Array[String]变量greetStrings的类型,3为实例初始化参数。 java
Scala里的数组是经过把索引放在圆括号里面访问的,而不是像Java那样放在方括号里。因此数组的第零个元素是greetStrings(0),不是greetStrings[0]。 编程
Scala如何看待val的意义的重要概念。当你用val定义一个变量,那么这个变量就不能从新赋值,但它指向的对象却仍能够暗自改变。因此在本例中,你不能把greetStrings从新赋值成不一样的数组;greetStrings将永远指向那个它被初始化时候指向的同一个Array[String]实例。可是你能一遍遍修改那个Array[String]的元素,所以数组自己是可变的。 数组
2.不可变List app
方法不该该有反作用是函数风格编程的一个很重要的理念。方法惟一的效果应该是计算并返回值。用这种方式工做的好处就是方法之间不多纠缠在一块儿,所以就更加可靠和可重用。另外一个好处(静态类型语言里)是传入传出方法的全部东西都被类型检查器检查,所以逻辑错误会更有可能把本身表现为类型错误。把这个函数式编程的哲学应用到对象世界里意味着使对象不可变。 函数式编程
Scala的List,scala.List,不一样于Java的java.util.List,老是不可变的(而Java的List可变) 函数
当你在一个List上调用方法时,彷佛这个名字指代的List看上去被改变了,而实际上它只是用新的值建立了一个List并返回。 spa
比方说,List有个叫“:::”的方法实现叠加功能。你能够这么用: scala
val oneTwo = List(1, 2) val threeFour = List(3, 4) val oneTwoThreeFour = oneTwo ::: threeFour
List最经常使用的操做符是发音为“cons”的‘::’。Cons把一个新元素组合到已有List的最前端,而后返回结果List。例如: code
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.")