一、scala中map的简单使用
// 创建一个空的可变map
// 在scala中HashMap也分可变和不可变,在使用过程中要注意时导的mutable 还是 immutable包下的HashMap
val emptyMap = HashMap[String, Int]()
println(emptyMap) // Map()
// 定义一个不可变Map
val immutableMap = Map("rock" -> 22, "jason" -> 32)
println(immutableMap)
// immutableMap("rock") = 33 // immutableMap.type does not take parameters
// 创建可变的map
val ages = scala.collection.mutable.Map("rock" -> 20, "jason" -> 33)
println(ages)
// 对可变map进行修改
ages("jason") = 30
println(ages)
// 获取一个key 33
println(ages("jason"))
// 获取不存在的key会报异常 Exception in thread "main" java.util.NoSuchElementException: key not found: yxj
// println(ages("jack"))
// 可以使用contains方法
val jack = if (ages.contains("jack")) ages("jack") else 0
println(jack) // ==> 0
/**
* 更好的方法是使用函数: getOrElse
* def getOrElse[B1 >: B](key: A, default: => B1): B1 = get(key) match {
* case Some(v) => v
* case None => default
* }
*
* 调用该方法时 实际上会根据值进行匹配,匹配不到返回参数中指定的默认值
*/
val wll = ages.getOrElse("jack", 1)
println(wll) // ==> 1
// 修改 不可变map
val maps = immutableMap + ("jack" -> 33)
println(maps) // 打印 Map(Jim -> 22, yxj -> 33)
// 两个map相加
val mapss = maps ++ maps
println(mapss)
// 删除map中值
val map = immutableMap - "jack"
println(map)
// map的遍历,遍历所有的
for ((key, value) <- ages) {
println(key + ":" + value)
}
// 遍历key
for (key <- ages.keySet) {
println("key=" + key)
}
// 遍历 value
for (value <- ages.values) {
println("value=" + value)
}
/**
* 排序
* 定义一个不可变的SortedMap
* 在操作映射时,需要选定一个实现(哈希表或者平衡树,默认情况下scala给的是哈希表。
* 由于对使用的键没有很好的哈希函数,或者需要顺序的地访问所有的键,
* 如果要得到一个不可变的树形映射而不是哈希映射的话,可以直接使用 immutable.SortedMap
*/
val scores: SortedMap[String, Int] = SortedMap(
"Alice" -> 98,
"Mark" -> 67,
"Bob" -> 82,
"Cindy" -> 59
)
println(scores)
// scala中并没有可变的树形映射,不过可以使用java中的TreeMap,与java进行互操作
// 需要引入 import scala.collection.JavaConversions._ 包 可以进行java与scala的相互转换
val scalaScores = new util.TreeMap[String,Int]()
二、Scala中集合
所有的集合都扩展于Iterable ,集合分为三大类,分别是序列、集和映射。对于几乎所有的集合类scala都提供了可变和不可变版本。scala列表要么是空的,要么拥有一头一尾,其中尾部本身又是一个列表。集是无先后次序的集合 。使用LinkHashSet来保留插入顺序,或者用SortedSet来按顺序进行迭代
我们以一张图来展示构成Scala集合继承层级最重要的特质
scala同时支持可变和不可变的集合,不可变的集合从不改变,因此可以完全安全地共享其引用,甚至在一个多线程的应用程序中也没有问题。举例来说,即有scala.collection.immutable.Map,也有scala.collection.mutable.Map。他们有一个共有的超类 scala.collection.Map (这个类没有定义任何的改值操作)。
scala优先采用不可变集合,scala.collection包中的伴生对象产出不可变的集合。
序列
下图展示了最重要的不可变序列
Vector是ArrayBuffer不可变的版本,一个带下标的的序列,支持快速随机访问。
Range表示一个整数序列。
下图展示了最重要的可变序列