Scala之集合归纳
1. 背景
- 编程语言设计点
- 数据类型
- 流程控制
- 运算符
- 注释
- 方法和函数定义
- 权限控制
- 集合
- IO流
- 网络编程
- 多线程
- 集合可以看成是一个箱子,箱子里面很多格子。格子里面盛放一个一个的数据。这些格子可以连续排列,可以无序排列,可以有关联,可以无关联。

- 所有的编程语言基本都会设计集合,有序集合,无序集合,数组、List、map、set等等。
- 整体scala的集合设计和java很相似,不同的是,scala为了更好支持函数式编程,集合的方法更加丰富。毕竟真实企业开发中,流程控制和集合才是应用的最多的,所以scala的集合使用结合自带的函数,可以有非常丰富的功能应用。例如一行代码实现wordcount
2. 序列
2.1 概述
- 在集合中,如果存放数据的一个个格子都是有顺序关系的,可以按照特定顺序访问,则可以称之为序列。
- 和java的集合设计一样,也是通过划分接口,不过scala中称之为trait。
- collection.Seq是一个trait,是所有可变或不可变序列类型的抽象,其子trait collection.mutable.Seq及collection.immutable.Seq分别对应可变和不可变序列。

- 注意,scala中为了更好做优化,针对集合也做了长度可变和不可变的设计。因为实际代码实现,为了支持集合长度可变,是牺牲了一定性能的。而scala中干脆将可变长度集合与不可变长度集合区分开,这样一部分场景下,使用不可变集合即可,性能更高
- 注意,可变与不可变指的是集合长度或者说容积,并不是说集合中元素内容不可更改。还是最开始那个示意图,集合就是一个箱子,箱子中是一个一个的格子。集合可变不可变指的是箱子的容积是否可以增加,而不是说一个一个格子中对应内容是否可以变化。不管可变不可变集合,箱子中一个一个格子对应的内容都是可以发生改变的。
2.2 不可变数组
package com.doit.array
object ArrayTest1 {
def main(args: Array[String]): Unit = {
val ints: Array[Int] = Array(1, 2,3, 4, 5)
val array: Array[Any] = Array(1, 3l, "errt", true, 'c', 12.13)
}
}
val ints: Array[Int] = Array(1, 2,3, 4, 5)
val array: Array[Any] = Array(1, 3l, "errt", true, 'c', 12.13)
println(ints(0))
println("分割线===================")
println(ints(3))
ints(3) = 100
println(ints(3))
println("分割线===================")
for(ele <- array) {
println(ele)
}
println("分割线===================")
for(index <- 0 until ints.length) {
println(ints(index))
}
println("分割线===================")
ints.foreach(e=>println(e))
println("分割线===================")
ints.map(x=>println(x))
println("分割线===================")
package com.doit.array
import scala.collection.mutable
object ArrayTest1 {
def main(args: Array[String]): Unit = {
val ints: Array[Int] = Array(1, 2,3, 4, 5)
val array: Array[Any] = Array(1, 3l, "errt", true, 'c', 12.13)
println(ints(0))
println("分割线===================")
println(ints(3))
ints(3) = 100
println(ints(3))
println("分割线===================")
for(ele <- array) {
println(ele)
}
println("分割线===================")
for(index <- 0 until ints.length) {
println(ints(index))
}
println("分割线===================")
ints.foreach(e=>println(e))
println("分割线===================")
ints.map(x=>println(x))
println("分割线===================")
println(ints.min)
println(ints.max)
println("分割线===================")
println(ints.head)
println(ints.last)
println("分割线===================")
val tail: Array[Any] = array.tail
tail.foreach(println)
println("分割线===================")
val list: List[Int] = ints.toList
println(list.size)
println("分割线===================")
val diff: Array[Int] = ints.diff(Array(3, 4, 5))
diff.foreach(println)
println("分割线===================")
println(ints.sum)
println("分割线===================")
val array1: Array[Int] = Array(100, 0, 3, -1, 30)
val sorted: Array[Int] = array1.sorted
sorted.foreach(println)
println("分割线===================")
array1.update(2, 987)
array1.foreach(println)
println("分割线===================")
println(array1.length)
println(array1.size)
println("分割线===================")
val array2: Array[Int] = array1.take(2)
array2.foreach(println)
println("分割线===================")
val array3: Array[Int] = array2.:+(1000)
array3.foreach(println)
println("分割线===================")
val i: Int = array3.count(e => e > 200)
println(i)
println("分割线===================")
val reverse: Array[Int] = array3.reverse
reverse.foreach(println)
println("分割线===================")
val combines: Array[Int] = array3 ++ array2
combines.foreach(println(_))
println("分割线===================")
val buffer: mutable.Buffer[Int] = array3.toBuffer
}
}
2.3可变数组
- 可变数组,需要导入对应包名,或者直接以全类名进行使用。但全类名使用,类名就太长了。
- import scala.collection.mutable.ArrayBuffer 注意,scala中import语句可以放在任何代码使用前的地方,而java规定必须放在代码文件顶部。不过实际生产中,import代码的位置和java一样,这样会规范很多。但如果遇到了代码中有import的代码也不要觉得奇怪。
- scala中,数组也是划分了可变长度数组和不可变长度数组。注意是长度不可变!!!!
package com.doit.array
import scala.collection.mutable.ArrayBuffer
object MutableArrayTest1 {
def main(args: Array[String]): Unit = {
val buffer: ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)
val buffer1: ArrayBuffer[Any] = ArrayBuffer(1, 23.1, true, 'x', "erer")
buffer += 78
buffer.foreach(println)
println("分割线==========================")
val buffer2: buffer1.type = buffer1 ++= buffer
buffer2.foreach(println(_))
println("分割线==========================")
val buffer3: buffer.type = buffer --= Array(2, 3)
buffer3.foreach(println(_))
println("分割线==========================")
buffer.remove(1)
buffer.foreach(println(_))
println("分割线==========================")
buffer1.remove(0, 2)
buffer1.foreach(println(_))
println("分割线==========================")
val toArray: Array[Any] = buffer1.toArray
println("分割线==========================")
}
}
2.4List
2.4.1 不可变List
package com.doit.list
import scala.collection.mutable
object ListTest2 {
def main(args: Array[String]): Unit = {
val list = List("java", "c++", "php", "sql", 12, 9527)
val list1: List[String] = "hive" :: "mysql" :: "hbase" :: Nil
val list2 = List.empty[Nothing]
println("分割线====================")
val list3: List[String] = list2 :+ "oracle"
list3.foreach(println(_))
println("分割线====================")
val list4: List[String] = list2 ++ list3
list4.foreach(println)
println("分割线====================")
val list5: List[String] = list4.take(2)
list5.foreach(println(_))
println("分割线====================")
val list6: List[String] = list4.takeRight(3)
list6.foreach(println)
println("分割线====================")
val list7: List[String] = list1.collect({
case x: String => x })
list7.foreach(println(_))
println("分割线====================")
val maybeString: Option[String] = list1.find(x => x.startsWith("my"))
maybeString.foreach(println(_))
println("分割线====================")
println(list1.isEmpty)
println("分割线====================")
val buffer: mutable.Buffer[String] = list1.toBuffer
println("分割线====================")
}
}
2.4.1 可变List
package com.doit.list
import scala