和 Java 一样,Scala 也有表示键值对(Key
-Value
)集合的 Map
数据结构。同样,Map
也分不可变和可变,不可变需要使用类 scala.collection.mutable.Map
。
可以使用以下语法定义不可变 Map 对象
val/var map = Map(key1 -> value1, key2 -> value2, key3 -> value3, ...) // 推荐,可读性好
val/var map = Map((key1, value1), (key2, value2), (key3, value3), ...)
下面例子,定义了一个球员与身价的 Map
,并获取其中一名球员的身价,如果获取的 key
不存在,则会抛出 NoSuchElementException
:
scala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: Map[String, Int] = Map(C朗 -> 1500000, 美斯 -> 21000000, 夏兰特 -> 150000000, 姆总 -> 120000000)
scala> map("美斯")
val res6: Int = 21000000
scala> map("武磊")
java.util.NoSuchElementException: key not found: 武磊
at scala.collection.immutable.Map$Map4.apply(Map.scala:515)
... 35 elided
使用 scala.collection.mutable.Map
类,可实现可变 Map
集合,语法跟不可变 Map
一致:
scala> import scala.collection.mutable.Map
scala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美 斯 -> 21000000)
scala> map("夏兰特")
val res8: Int = 150000000
scala> map("武磊")
java.util.NoSuchElementException: key not found: 武磊
at scala.collection.MapOps.default(Map.scala:274)
at scala.collection.MapOps.default$(Map.scala:273)
at scala.collection.AbstractMap.default(Map.scala:405)
at scala.collection.mutable.HashMap.apply(HashMap.scala:425)
... 35 elided
scala> map("武磊") = 1000000
scala> map("武磊")
val res10: Int = 1000000
获取 Map
集合中的值可以使用以下两种方式:
(1) 使用表达式 map(key)
,当 key
不存在会抛出 NoSuchElementException
(2) 使用 getOrElse(key, defaultValue)
方法
例如:
scala> import scala.collection.mutable.Map
scala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美 斯 -> 21000000)
scala> map.getOrElse("武磊", 500000)
val res11: Int = 500000
通过 keys
属性,可以获取 Map
集合中的 key
集合,这个集合为 Set
类型:
scala> import scala.collection.mutable.Map
scala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美 斯 -> 21000000)
scala> map.keys
val res12: Iterable[String] = Set(夏兰特, C朗, 姆总, 美斯)
通过 values
属性,可以获取 Map
集合中的 value
集合:
scala> import scala.collection.mutable.Map
scala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美 斯 -> 21000000)
scala> map.values
val res13: Iterable[Int] = Iterable(150000000, 1500000, 120000000, 21000000)
使用 for
可以遍历 Map
对象:
scala> import scala.collection.mutable.Map
scala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美 斯 -> 21000000)
scala> for((player, price) <- map) {
| println(s"${player}身价为${price}")
| }
夏兰特身价为150000000
C朗身价为1500000
姆总身价为120000000
美斯身价为21000000
使用运算符 +
可以在原 Map
对象基础上增加新的键值对,并返回新的 Map
对象。
下面的例子,使用 +
添加了新的 (key,value),并返回新的 Map
对象,原来的 Map
对象不变:
scala> import scala.collection.mutable.Map
scala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美 斯 -> 21000000)
scala> val map1 = map + ("韦世豪" -> 600000)
val map1: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美斯 -> 21000000, 韦世豪 -> 600000)
scala> map
val res16: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美斯 -> 21000000)
scala> map1
val res17: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美斯 -> 21000000, 韦世豪 -> 600000)
-
可以从原 Map
对象删除指定的键值对,并返回新的 Map
对象,原来的 Map
对象不变。scala> import scala.collection.mutable.Map
scala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美 斯 -> 21000000)
scala> map - "姆总"
val res18: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 美斯 -> 21000000)
scala> map
val res19: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美斯 -> 21000000)
Map
对象删除指定的键值对,则可使用 remove
方法:scala> import scala.collection.mutable.Map
scala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美 斯 -> 21000000)
scala> map.remove("夏兰特")
val res22: Option[Int] = Some(150000000)
scala> map
val res23: scala.collection.mutable.Map[String, Int] = HashMap(C朗 -> 1500000, 姆总 -> 120000000, 美斯 -> 21000000)