一、常用的集合方法
1.可遍歷集合的常用方法
下表列出了Traverable在所有集合常用的方法。接下來的符號:
-
c代表一個集合
-
f代表一個函數
-
p代表一個謂詞
-
n代表一個數字
-
op代表一個簡單的操作(通常是一個簡單的函數)
2.可變的集合方法
下表裏的是可變集合常用的操作符:
3.不可變的集合方法
注意不可變集合不可被修改,所以在第一行的每個表達式的結果必須賦給一個新變量。
操作符 | 描述 |
c1 ++ c2 | 把c2集合的元素附加到c1裏創造一個新的集合 |
scala> val c1 = Vector(1,2,3,4,5)
c1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
scala> val c2 = Vector(6,7,8)
c2: scala.collection.immutable.Vector[Int] = Vector(6, 7, 8)
scala> c1 ++ c2
res35: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8)
操作符 | 描述 |
c :+ e | 返回把元素e附加到集合c的新集合 |
scala> val v1 = Vector(1,2,3,4,5)
c1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
scala> val e = 10
e: Int = 10
scala> v1 :+ e
res38: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5, 10)
操作符 | 描述 |
e +: c2 | 返回一個把元素e前插到集合c的新集合 |
scala> val v1 = Vector(1,2,3,4,5)
c1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
scala> val e = 10
e: Int = 10
scala> e +: v1
res39: scala.collection.immutable.Vector[Int] = Vector(10, 1, 2, 3, 4, 5)
操作符 | 描述 |
e :: list | 返回一個把e前插到名爲list列表的集合(::只在List集合上用) |
scala> val list = List(7,8,9)
list: List[Int] = List(7, 8, 9)
scala> val e = 10
e: Int = 10
scala> e :: list
res75: List[Int] = List(10, 7, 8, 9)
操作符 | 描述 |
c drop n | 把c2集合的元素附加到c1裏創造一個新的集合 |
scala> val v1 = Vector(1,2,3,4,5)
v1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
scala> val n = 3
n: Int = 3
scala> v1 drop n
res1: scala.collection.immutable.Vector[Int] = Vector(4, 5)
操作符 | 描述 |
c1 take n | 把集合的前兩個元素列出來 |
scala> val c1 = Vector(1,2,3,4,5)
c1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
scala> c1 take 2
res82: scala.collection.immutable.Vector[Int] = Vector(1, 2)
4.可變和不可變的map的常用方法
-
m代表一個不可變map
-
mm代表一個可變的map
-
k代表一個鍵
-
v代表一個值
-
p代表一個謂詞
-
c代表一個集合
如果是var修飾,引用可變,支持讀寫。
如果是val修飾,引用不可變,支持讀寫。
操作符 | 描述 |
m - k | 返回刪除key(以及相應的value的值)後的map |
scala> val v1 = Vector(1,2,3,4,5)
v1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
scala> val map = Map(1 -> "a",2 -> "b",3 -> "c")
map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c)
scala> map - 1
res5: scala.collection.immutable.Map[Int,String] = Map(2 -> b, 3 -> c)
操作符 | 描述 |
m - (k1,k2,k3) | 返回刪除k1,k2,k3後的map |
scala> val map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d",5 -> "e",6 -> "f")
map: scala.collection.immutable.Map[Int,String] = Map(5 -> e, 1 -> a, 6 -> f, 2-> b, 3 -> c, 4 -> d)
scala> map - (1,3,5)
res6: scala.collection.immutable.Map[Int,String] = Map(6 -> f, 2 -> b, 4 -> d)
操作符 | 描述 |
m -- c | 返回刪除key後的map,c是指集合 |
scala> val map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d",5 -> "e",6 -> "f")
map: scala.collection.immutable.Map[Int,String] = Map(5 -> e, 1 -> a, 6 -> f, 2-> b, 3 -> c, 4 -> d)
scala> val c = Vector(1,3,5)
c: scala.collection.immutable.Vector[Int] = Vector(1, 3, 5)
scala> map -- c
res7: scala.collection.immutable.Map[Int,String] = Map(6 -> f, 2 -> b, 4 -> d)
操作符 | 描述 |
m -- List(k1,k2) | 返回刪除key後的map |
1
scala> val map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d",5 -> "e",6 -> "f")
map: scala.collection.immutable.Map[Int,String] = Map(5 -> e, 1 -> a, 6 -> f, 2-> b, 3 -> c, 4 -> d)
scala> val list = List(1,3,5)
list: List[Int] = List(1, 3, 5)
scala> map -- list
res8: scala.collection.immutable.Map[Int,String] = Map(6 -> f, 2 -> b, 4 -> d)
2
scala> val map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d",5 -> "e",6 -> "f")
map: scala.collection.immutable.Map[Int,String] = Map(5 -> e, 1 -> a, 6 -> f, 2
-> b, 3 -> c, 4 -> d)
scala> map -- List(1,2,3)
res9: scala.collection.immutable.Map[Int,String] = Map(5 -> e, 6 -> f, 4 -> d)
操作符 | 描述 |
m(k) | 返回k的value |
scala> var map = Map(1 -> 1,2 -> 2,3 -> 3,4 -> 4)
map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1, 2 -> 2, 3 -> 3, 4 ->4)
scala> map(2)
res34: Int = 2
操作符 | 描述 |
m contains k | 如果map包含k則返回true |
scala> var map = Map(1 -> 1,2 -> 2,3 -> 3,4 -> 4)
map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1, 2 -> 2, 3 -> 3, 4 ->4)
scala> map contains 3
res36: Boolean = true
操作符 | 描述 |
m get k | 如果k存在返回Some[A]作爲key的值,否則None |
scala> var map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d")
map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4-> d)
scala> map get 2
res44: Option[String] = Some(b)
scala> map get 5
res45: Option[String] = None
操作符 | 描述 |
m getOrElse(k,d) | 如果k找到的話,返回k的值,否則返回默認值d |
scala> var map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d")
map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4-> d)
scala> map getOrElse(2,"hello")
res46: String = b
scala> map getOrElse(5,"hello")
res47: String = hello
操作符 | 描述 |
m isDefinedAt k | 如果map包含k則返回true |
scala> var map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d")
map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4-> d)
scala> map isDefinedAt 2
res48: Boolean = true
scala> map isDefinedAt 5
res49: Boolean = false
操作符 | 描述 |
m keys | 把map中的keys作爲Iterable返回 |
scala> var map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d")
map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4-> d)
scala> map keys
warning: there was one feature warning; re-run with -feature for details
res50: Iterable[Int] = Set(1, 2, 3, 4)
操作符 | 描述 |
m keySet | 把map中的keys作爲Set返回 |
scala> var map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d")
map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4-> d)
scala> map keySet
warning: there was one feature warning; re-run with -feature for details
res54: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 4)
操作符 | 描述 |
m values | 把map中的value作爲Iterable返回 |
scala> var map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d")
map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4-> d)
scala> map values
warning: there was one feature warning; re-run with -feature for details
res56: Iterable[String] = MapLike(a, b, c, d)
二、在創建集合時聲明一個類型
想要創建一個混合型的集合,scala不會自動分配想要的類型。
創建一個手動的集合如下:
scala> trait Animal defined trait Animal scala> trait FurryAnimal extends Animal defined trait FurryAnimal scala> case class Dog(name: String) extends Animal defined class Dog scala> case class Cat(name: String) extends Animal defined class Cat scala> val x = Array(Dog("Fido"),Cat("Felix")) x: Array[Product with Serializable with Animal] = Array(Dog(Fido), Cat(Felix))
如上所示,scala給product指定了Serializable和Animal類型。如果想要一個Array[Animal],手動需要指定類型:
scala> val x = Array[Animal](Dog("Fido"),Cat("Felix"))
x: Array[Animal] = Array(Dog(Fido), Cat(Felix))
三、可變變量集合與不可變量集合
但把一個不可變的Vector賦給一個可變的var時,似乎可以給它添加元素。
scala> var sisters = Vector("Melinda") sisters: scala.collection.immutable.Vector[String] = Vector(Melinda) scala> sisters = sisters :+ "Melissa" sisters: scala.collection.immutable.Vector[String] = Vector(Melinda, Melissa) scala> sisters = sisters :+ "Marisa" sisters: scala.collection.immutable.Vector[String] = Vector(Melinda, Melissa, Ma risa) scala> sisters.foreach(println) Melinda Melissa Marisa
儘管你看起來改變了一個不可改變的集合,但實際上是每次用:+方法時sisters變量會指向一個新的集合。sisters變量是可變的,所以每次執行時相當於重新賦值一個新的集合。
總結:
- 一個可變的變量var可以被賦予一個新的數據。
- 一個不可變的變量val就如java中的final變量,不可能被重新賦值。
- 在可變集合的元素中可以被改變(ArrayBuffer)。
- 在不可被改變的集合元素中不可被改變(Vector)。