Mutable Immutable 集合
Scala 集合類系統區變變集合
scala.collection 包所集合類
scala.collection.mutable 所集合類
變集合顧名思義意味著修改移除或者添加元素
scala.collection.immutable 所集合類
變集合相比變集合變集合永遠改變仍像變集合操作(修改添加刪除某集合元素)變集合些操作每種情況都返新集合同原集合發改變由於特性變集合線程安全Scala默認情況采用變集合所使用優先使用變集合變集合適用於數情況
同集合使用場景
其用集合三種:ListSetMap
列表 List
List 繼承至 Seq集合元素重復
e.g.
scala> val l = List(1, 1, 2, 2, 3, 5)
l: List[Int] = List(1, 1, 2, 2, 3, 5)
所集合內元素重復候選擇 List 或者 Seq
集 Set
Set 元素重復
e.g.
scala> val s = Set(1, 1, 2, 2, 3, 5)
s: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 5)
所集合內元素重復候選擇 Set
映射 Map
Map 元素呈現 key -> value 形式其第參數映射鍵第二參數映射值且Map每元素鍵唯
e.g.
scala> val m = Map(1 -> 1, 1 -> 3, 2 -> 3, 3 -> 4, 4 -> 4, 5 -> 7)
m: scala.collection.immutable.Map[Int,Int] = Map(5 -> 7, 1 -> 3, 2 -> 3, 3 -> 4, 4 -> 4)
所集合元素 key -> value 形式且每元素鍵重復候選擇 Map
集合使用
各集合操作間比較
始介紹同使用場景前我先比同操作同集合所產結何異同
map、filter、collect 比較
//定義列表
scala> val l = List(1, 2, 3, 4, 5)
l: List[Int] = List(1, 2, 3, 4, 5)
//map操作
scala> l.map(_ * 2)
res0: List[Int] = List(2, 4, 6, 8, 10)
//filter操作
scala> l.filter(_ > 2)
res3: List[Int] = List(3, 4, 5)
//collect操作
scala> l.collect {case i if i > 2 => i * 2}
res1: List[Int] = List(6, 8, 10)
通結比我看:
map 操作集合除元素數原集合其都
filter 操作集合原集合集
collect 操作集合雖原集合仔細觀察看 collect 操作結 map 操作結集且元素數 filter 操作集合元素數相同
flatten flatMap 比較
//定義列表
scala> val l = List(List(1, 2, 3), List(4, 5, 6), Seq(7, 8, 9))
l: List[Seq[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
//flatten操作
scala> l.flatten
res5: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
//flatMap操作
scala> l.flatMap(i => i.map(_ * 2))
res6: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18)
通結我看flatten flatMap 都嵌套結構扁平化層集合:
flatten 僅僅嵌套結構扁平化並沒改變原集合內層列表元素值
flatMap 僅嵌套結構扁平化且改變原集合內層列表元素值其實 flatMap flatten 再做 map操作
補充:操作返都批量結要查找某特定元素則采用類比:
filter -> find
collect -> collectFirst
同使用場景
通比我集合用操作結致認識接我看看同場景何科選擇相應集合操作
我先定義些要面場景使用數據結構:
case class Student(
name: String,
age: Int,
sex: String
)
val jilen = Student(
name = "Jilen",
age = 30,
sex = "m"
)
val shaw = Student(
name = "Shaw",
age = 18,
sex = "m"
)
val yison = Student(
name = "Yison",
age = 40,
sex = "f"
)
val l = List(jilen, shaw, yison)
l: List[Student] = List(Student(Jilen,30,m), Student(Shaw,18,m), Student(Yison,40,f))
我定義組列表
場景:我要些姓名所組列表
析:姓名所組列表原列表(列表)同全新列表所選用 map
val nameList = l.map(_.name)
nameList: List[String] = List(Jilen, Shaw, Yison)
map 集合每元素應用函數返應用元素所組集合通情況map所返集合原集合同類型集合全新集合
場景二:我要所性別男(m)所組列表
析:列表列表並且該列表原列表集附加條件:男性所選用 filter
val maleList = l.filter(_.sex == "m")
maleList: List[Student] = List(Student(Jilen,30,m), Student(Shaw,18,m))
filter 般用於移除集合滿足條件元素返滿足條件元素所組集合
用 collect 解決問題:
val maleList = l.collect{case s if s.sex == "m" => s}
maleList: List[Student] = List(Student(Jilen,30,m), Student(Shaw,18,m))
比發現filter更加簡潔
場景三: 我要男姓名所組列表
析:要男姓名我首先要男再獲取些姓名所我容易采用:
val maleNameList = l.filter(_.sex == "m").map(_.name)
maleNameList: List[String] = List(Jilen, Shaw)
通我前各集合操作間比較所結論由於男姓名列表原列表(列表)完全同並且該列表姓名列表集所我采用 collect:
val maleNameList = l.collect{case s if s.sex == "m" => s.name}
maleNameList: List[String] = List(Jilen, Shaw)
結面操作結
collect 接受偏函數集合每元素應用該函數返應用元素所組列表 collect 看作先做 filter 操作再做 map 操作:
場景二 collect 操作看作:
l.filter(_.sex == "m").map(s => s)
List[Student] = List(Student(Jilen,30,m), Student(Shaw,18,m))
其用
場景四:現我要每列表位置便給編號
析:我采用 -> 編號 形式組織與編號前關系我采用 zipWithIndex:
l.zipWithIndex
List[(Student, Int)] = List((Student(Jilen,30,m),0), (Student(Shaw,18,m),1),(Student(Yison,40,f),2))
zipWithIndex 集合內元素與該元素集合位置組合起其實集合內元素與該元素位置組元組元組第二值元素集合所處位置
場景五:現要男組男組集合組集合
析:根據場景描述新集合內元素應該:sex -> List[Student]形式我采用:groupBy:
val group = l.groupBy(_.sex)
group: scala.collection.immutable.Map[String,List[Student]] = Map(m -> List(Student(Jilen,30,m), Student(Shaw,18,m)), f -> List(Student(Yison,40,f)))
groupBy 集合按照特定要求進行組返 Map類型