构造映射
不可变的Map[String,Int]
val scores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)
可变的映射
val scores_1 = scala.collection.mutable.Map("Alice" -> 3, "Cindy" -> 8)
如果想从一个空的映射开始
val scores_2 = new scala.collection.mutable.HashMap[String, Int]
在scala中,映射是对偶的集合
->操作符用来创建对偶
val scores_3 = Map(("Alice", 10), ("Bob", 3), ("Cindy", 8))
-> 操作符看上去比圆括号更易读那么一点
获取映射的值
在scala中,函数和映射之间的相似性尤为明显,因为你将使用()表示法来查找某个对应的值。
val scores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8) val bobsScore=scores("Bob") print(bobsScore)
结果:
3
如果映射并不包含请求中使用的键,则会抛出异常。
要检查映射中是否有某个指定的键,可以用contains方法。
val scores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8) val bobsScore = if(scores.contains("Bob")) scores("Bob") else 0 print(bobsScore)
结果
3
由于这样的组合调用十分普遍,以下是一个快捷写法。
val scores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8) val bobsScore = scores.getOrElse("Bob", 0) print(bobsScore)
结果
3
更新映射中的值
不能更新一个不可变的映射
val scores_2 = new scala.collection.mutable.HashMap[String, Int] scores_2("Bob") = 10 scores_2("Fred") = 7 scores_2 += ("chen" -> 1,"shen" -> 4) val bobsScore = scores_2.getOrElse("Bob", 0) print(bobsScore)
结果
10
要移除某个键和对应的值,使用-=操作符
val scores_2 = new scala.collection.mutable.HashMap[String, Int] scores_2("Bob") = 10 scores_2("Fred") = 7 scores_2 += ("chen" -> 1,"shen" -> 4) scores_2 -= "chen" print(scores_2.getOrElse("chen", 0))
结果
0
不能更新一个不可变的映射,但众多可以做一些同样有用的操作--获取一个包含所需要的更新的新映射。
val scores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8) val newScores = scores + ("shen" -> 2, "long" -> 87) print(newScores)
结果:
Map(Bob -> 3, long -> 87, Alice -> 10, shen -> 2, Cindy -> 8)
除了把结果作为新值保存外,也可以更新var变量。
var scores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8) var newScores = scores + ("shen" -> 2, "long" -> 87) print(newScores)
结果:
Map(Bob -> 3, long -> 87, Alice -> 10, shen -> 2, Cindy -> 8)
要从不可变的映射中移除某个键,可以用-操作符。
var scores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8) scores = scores - "Alice" print(scores)
结果
Map(Bob -> 3, Cindy -> 8)
迭代映射
var scores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8) for(v <- scores.values){ print(v+",") }
结果:
10,3,8,
获取key
var scores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8) for (k <- scores.keySet) { print(k + ",") }
结果
Alice,Bob,Cindy,
已排序的映射
在操作映射时,你需要选定一个实现,一个哈希表或者一个平衡树。默认情况下,scala给的是哈希表。由于对使用的键没有很好的哈希函数,或者需要顺序地访问所有的键,因此,你可能会想要一个树形映射。
要得到一个不可变的树形映射而不是哈希映射的话。可以用:
val scores = scala.collection.immutable.SortedMap("Alice" -> 10, "Fred" -> 7, "Bob" -> 3, "Cindy" -> 8) print(scores)
结果
Map(Alice -> 10, Bob -> 3, Cindy -> 8, Fred -> 7)
val months = scala.collection.mutable.LinkedHashMap("January" -> 1, "February" -> 2, "March" -> 3, "April" -> 4, "May" -> 5) print(months)
结果
Map(January -> 1, February -> 2, March -> 3, April -> 4, May -> 5)
与java互操作
把scala映射传递给预期java映射的方法,提供相反的隐式转换。
import scala.collection.JavaConversions.mapAsJavaMap import java.awt.font.TextAttribute._ //scala映射 val attrs = Map(FAMILY -> "Serif", SIZE -> 12) //该方法预期一个java映射 val font = new java.awt.Font(attrs) print(font)
结果
java.awt.Font[family=Serif,name=Serif,style=plain,size=12]