一、可变集合和不可变集合
- 可变(mutable)集合
- 不可变(immutable)集合:
- 集合从不改变,因此可以安全地共享其引用。
- 甚至是在一个多线程的应用程序当中也没问题。
object MapTest {
def main(args: Array[String]): Unit = {
//定义不可变Map
var immutableMap = scala.collection.immutable.Map("alice"->80,"bob"->90)
//定义可变Map
var mutableMap=scala.collection.mutable.Map("cllen"->100,"efos"->77)
//如果key存在就输出value,如果可以不存在就报错
//java.util.NoSuchElementException: key not found: efo1s
println(immutableMap("alice"))
println(mutableMap("efo1s"))
//判断mike存不存在,存在输出value,不存在输出-1
if(immutableMap.contains("mike")){
print("mike")
}else{
println(-1)
}
//上面的简单写法
println(mutableMap.getOrElse("lary",0))
//对immutableMap的value进行修改
var ee =(immutableMap("alice")=10)
//报错
println(immutableMap("alice"))
//Error:(20, 14) value update is not a member of scala.collection.immutable.Map[String,Int]
var ee =(immutableMap("alice")=10)
//mutableMap值修改成功并可以输出value为20
var dd= (mutableMap("efos")=20)
println(mutableMap("efos"))
}
}
涉及的集合操作:
(1)contains 对Map的key进行判断
(2)Map元素赋值操作
二、列表
2.1不可变列表(List)
不可变列表的相关操作:
scala> List(7,8,9).head
res41: Int = 7
scala> List(7,8,9).tail
res42: List[Int] = List(8, 9)
2.2 可变列表(LinkedList):scala.collection.mutable
scala> scala.collection.mutable.LinkedList(1,2,3,4,5)
//warning: there was one deprecation warning; re-run with -deprecation for details
//res45: scala.collection.mutable.LinkedList[Int] = LinkedList(1, 2, 3, 4, 5)
scala> scala.collection.mutable.LinkedList(1,2,3,4,5).map(_*2)
//warning: there were two deprecation warnings; re-run with -deprecation for details
//res46: scala.collection.mutable.LinkedList[Int] = LinkedList(2, 4, 6, 8, 10)
总结:scala中的mutable为可改变的,默认为不可改变。此时需要导入包。
三、序列
常用的序列有:Vector和Range。
-
Vector是ArrayBuffer的不可变版本,是一个带下标的序列。
-
Range表示一个整数序列
scala> Range(0,5)
//res49: scala.collection.immutable.Range = Range(0, 1, 2, 3, 4)
scala> 0 until 5
//res50: scala.collection.immutable.Range = Range(0, 1, 2, 3, 4)
scala> 0 to 5
//res51: scala.collection.immutable.Range.Inclusive = Range(0, 1, 2, 3, 4, 5)
scala> Range(0,5).toList
//res52: List[Int] = List(0, 1, 2, 3, 4)
scala> Range(0,5)++Range(0,5)
//res54: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 2, 3, 4, 0, 1, 2, 3, 4)
四、集(Set)和集的操作
集Set是不重复元素的集合。
和列表不同,集并不保留元素插入的顺序。默认以Hash集实现。
- 创建集
scala> Set(2,1,1,2)
//res55: scala.collection.immutable.Set[Int] = Set(2, 1)
scala> scala.collection.mutable.LinkedHashSet("星期一","星期二","星期三")
//res56: scala.collection.mutable.LinkedHashSet[String] = Set(星期一, 星期二, 星期三)
scala> scala.collection.mutable.SortedSet(11,2,8,100,77)
//res57: scala.collection.mutable.SortedSet[Int] = TreeSet(2, 8, 11, 77, 100)
- 集操作
scala> scala.collection.mutable.SortedSet(11,2,8,100,77).contains(2)
//res58: Boolean = true
scala> scala.collection.mutable.SortedSet(11,2,8,100,77).contains(200)
//res59: Boolean = false
//并集,可以取出重复值
scala> Set(1,2,3,4,5) union Set(3,4,5,6,7)
//res60: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 7, 3, 4)
//交集
scala> Set(1,2,3,4,5) intersect Set(3,4,5,6,7)
//res61: scala.collection.immutable.Set[Int] = Set(5, 3, 4)
//差集
scala> Set(1,2,3,4,5) diff Set(3,4,5,6,7)
//res63: scala.collection.immutable.Set[Int] = Set(1, 2)
五、模式匹配
Scala有一个强大的模式匹配机制,可以应用在很多场合:
- switch语句
- 类型检查
var sign=99
var ch1:Char='-'
ch1 match {
case '+' =>sign=1
case '-'=>sign-1
//如果是其它类型,则输出sign=0
case _=>sign=0
}
println(sign)
Scala还提供了样本类(case class),对模式匹配进行了优化。
模式匹配示例:
- 更好的switch
- Scala的守卫
- 模式匹配中的变量
var str ="hello scala"
str(7) match {
case '+'=>println("这是一个+")
case '-'=>println("这是一个-")
case aa=>println("这是字符:"+aa)//c
}
//str(7)取0开始的编号为7的字符
- 类型模式
var str:Any ="hello scala"
str match {
case a:Int=>println("这是一个整数")
case b:String=>println("这是一个字符串")
case _=>println("其它类型")
}
- 匹配数组和列表
var str1=Array(1,2,3,4)
str1 match {
case Array(0)=>println("只有0")
case Array(x,y)=>println("有两个元素")
case Array(x,y,z)=>println("有三个元素")
case _=>println("有很多元素")
}