数组Array

scala中实例化数组的方式如下

  1. val greetStrings : Array[String] = new Array[String](3)
  2. greetStrings(0) = "hello"
  3. greetStrings(1) = ","
  4. greetStrings(2) = "world!"

虽然val定义的是常量,也就是定义之后不能被重新赋值,greetStrings那个对象不能被重新赋值,他将永远指向初始化时指定的Array[String]实例,但是变量指向的内部对象却仍可以改变,因此数组是可以改变的
如可以将第一个String改为hi

  1. greetStrings.update(0,"hi")

当然,上面的写法java气息是如此浓厚,也许应该让他有更简单的表现形式

  1. val numsName = Array("zero","one","two")

列表List

scala.List不同于Java中的java.util.List,Scala中的List是不可变的。
这里的不可变指的是其所实例化的对象完全不可变,包括其中所包含的对象也无法修改。

  1. val twoToThree = List(2,3)
  2. // :: 操作符在这里的作用为向列表最前端插入整数 1
  3. val oneToThree = 1 :: twoToThree
  4. println(OnetoThree)
  5. //结果如下
  6. List(1,2,3)

上面似乎修改了列表,但实际上并没有。当List调用某些方法时,原List不变,只是在原List基础上,新生成了一个List对象,并赋值给oneToThree
List的常用方法如下

List()或Nil 空List
List(“cool”,”tools”,”rule”) 创建带有三个值”cool”,”tools”,”rule”的List[String]
var thrill = “will” :: “fill” :: “until” :: Nil 创建带有三个值的List[String],最后使用Nil的理由:
如果不是用Nil,那么最后就成了字符串until调用 :: 方法,而对于String类型来说,是不存在该方法的
List(“a”,”b”) ::: List(“c”,”d”) 用于叠加两个列表,返回新的List("a","b","c","d")
thrill(2) 返回列表索引为2的元素(基于0),until
thrill.count(s => s.length == 4) 返回长度为4的元素个数
thrill.drop(2) 返回去掉前两个元素的List(“until”)
thrill.dropRight(2) 返回去掉后两个元素的列表List(“will”)
thrill.exists( s => s == “until” ) 判断是否有值为”until”的字符串在thrill中
thrill.filter(s => s.length == 4) 返回长度为4的元素组成的新列表
thrill.foralll(s => s.endsWith(“l”) ) 判断thrill所有元素,是否都以字符l结尾
thrill.foreach(s => print(s))或thrill.foreach() 对列表的每个元素执行print操作
thrill.head 返回列表的第一个元素
thrill.init 返回除最后一个元素之外的列表
thrill.isEmpty 判断列表是否为空
thrill.last 返回列表的最后一个元素
thrill.length 返列表的长度
thrill.map(s => s + “y”) 对每一个元素末尾加上y
thrill.mkString(“,”) 将每一个元素用,连接组成字符串
thrill.remove(s => s.length == 4) 移除列表中长度为4的元素
thrill.reverse 返回逆序列表
thrill.sort((s,t) => s.charAt(0).toLowerCase < t.charAt(0).toLowerCase) 返回按第一个字符排序的列表
thrill.tail 返回列表中除第一个元素之外的列表

Tips在上面这些方法中,会发现有些方法不需要括号,而有些方法的调用则需要括号
从方法定义来看无若一个方法无需传参,定义时可以带括号也可以不带括号

  1. class Hi{
  2. def sayHi: Unit ={
  3. println("hi")
  4. }
  5. def sayHello(): Unit = {
  6. println("hello")
  7. }
  8. }

如上所示,sayHi方法定义时没有带括号,而sayHello方法定义则带有括号

  1. val say:Hi = new Hi()
  2. say.sayHi
  3. say.sayHello
  4. say.sayHello()
  5. //结果如下
  6. hi
  7. hello
  8. hello

实例化一个Hi类,调用时sayHi方法,不带括号是允许的,但是如果带上括号,编译时则会提示错误Unit does not take parameters,而如果调用sayHello方法,带括号与不带括号均是允许的.

元组Tuple

与List相似,元组也是不可变的,但与List不同的是,元组可以包含不同类型的元素,而List只能包含一种类型的元素
元组实例化之后,可以基于索引直接访问其中的元素

  1. val pair = (99,"Luftballons")
  2. println(pair._1)
  3. println(pair._2)
  4. //结果如下
  5. 99
  6. Luftballons

元组不能像List那样直接用索引访问,如pair(0)访问是不允许的,因为列表的apply方法使用返回相同的类型,而元组中元素的类型不一定相同。

集合Set

Scala中的集合就是通常意义上的集合,无序,但是可被分为两类,可变集合和不可变集合,不可变与可变的区别则在于集合被改变时,是改变本身还是新生成一个集合。

映射Map

与以前所了解到的Map也基本一致,同样分为可变和不可变两类,键值对
对于任何对象,都可以调用->方法,并返回包含见键值对的二元组

  1. val tp = 1.->("test")
  2. println(tp.getClass)
  3. //结果如下
  4. //class scala.Tuple2

此处调用Int类型的数值1的->方法,参数为"test",返回元组给tp变量