5.1 构造映射
Scala构造映射与Java有很大的区别,基本语法如下:
val scores = Map(“Allan” -> 60, “Kevin” -> 70, “Kobe” ->80)
scores就是一个映射,但它是不可变的,如果要你想改变映射中的元素,那么就需要用到scala的mutable包:
val scores = scala.collection.mutable.Map(“Allan” -> 60, “Kevin” -> 70, “Kobe” ->80)
当然,你也可以创建一个空的映射,后续根据业务来往映射里面添加元素,但这种空的映射则需要指定key value的类型:
val scores = scala.collection.mutable.HashMap[String, Int]
这个跟Java中的Map相似,只不过Java中的语法是用<>来指定了key和value的类型:
Map<String, int> map = new HashMap<String, int>()
当然,定义映射还有另外一种方式:
val scores = Map((“Allan” ,60), (“Kevin” ,70), (“Kobe”,80))
虽然这种方式实现的效果是一样的,但是在Scala中,一般都不会采用这种方式。
映射已经创建好,如何取映射中的元素和修改元素,详见示例。
5.2 映射取值
Scala中,取映射的值和函数相似,用()符号就可以查找某个键对应的值,如果映射并不包含请求中的键,则会抛出异常。
检查某个指定键的值,可以用contains方法:
val englishScore = if (scores.contains(“english”)) scores(“english”) else 0
还有一种更简洁的写法:
val englishScore = scores.getOrElse(“english”, 0)。
5.3 更新映射的值
如要更新映射中的值,前提条件该映射是可变的,即为mutable下面的Map,添加一个映射键值对,直接使用=号进行赋值即可,例如:
scores(“Allan”) = 50 // 将键为Allan的值更新为50
scores(“Jack”) = 100 // 增加新的键值对
scores += (“Jack” -> 100) // 这样也是增加一个新的键值对
scores += (“Jack” -> 100, “Rose” -> 90) // 一次增加多个键值对
scores -= “Jack” // 移除一个键值对
5.4 映射迭代
遍历映射中所有键值对语法:
for ((k, v) <- 映射) k表示键,v表示值,可以在Scala的循环中使用模式匹配,如果只需要键或值,可以像Java一样,用keySet和values方法,values返回一个Iterable,然后在for循环中使用Iterable取值。
如果要将key和value反转,即交换键和值得位置,语法如下:
for ((k, v) <- 映射) yield (v, k) ,详见后面的示例。
5.5 与Java的互操作
如果通过Java得到一个Java映射,即Map,把它转换成一个Scala映射,需要用到scala.collection.JavaConversions.mapAsScalaMap,然后通过制定Scala映射类型触发转换。
val scores: scala.collection.mutable.Map[String, Int] = new java.util.TreeMap[String, Int]
除此之外,还可以将java.util.Properties转换成Scala映射。
val props: scala.collection.Map[String, String] = System.getProperties()
反过来,Scala映射也可以转换成Java映射。
代码示例:
object MapTest {
def main(args : Array[String]) {
// 定义一个不可修改的映射
val map = Map("iphone4" -> 10, "iphone5" -> 20, "iphone6" -> 30)
for ((k, v) <- map) yield(k, v * 2)
for ((k, v) <- map) println("key is " + k, " value is " + v)
// 定义一个可变的映射
val scores = scala.collection.mutable.Map("English" -> 80, "Math" -> 90)
println("可变的key value")
for ((k, v) <- scores) println("key is " + k, " value is " + v)
// 加key value
scores += ("Music" -> 100)
println("加key value")
for ((k, v) <- scores) println("key is " + k, " value is " + v)
// 减key value
scores -= "English"
println("减key value")
for ((k, v) <- scores) println("key is " + k, " value is " + v)
// 判断是否有键为English的值,如果没有,则默认为0
val englishScore = scores.getOrElse("english", 0)
println(englishScore)
}
}