Scala学习笔记(3)-数组集合元组

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.")

你可能感兴趣的:(Scala学习笔记(3)-数组集合元组)