Scala 的 Map (映射 或称为 哈希表)是一组 键->值 对的对象。

任何值都可以根据键来进行检索,键在映射中是唯一的

映射有两种,不可变的和可变的

可变对象和不可变对象之间的区别在于,当对象不可变时,对象本身无法更改

默认情况下,Scala 使用不可变映射(Map)
如果要使用可变集合(Map),则需要明确导入 scala.collection.mutable.Map
如果想同时使用可变的和不可变映射(Map),那么可以继续引用不可变映射(Map),但是可以将 mutable 集合引用mutable.Map


一、定义

val 定义的 Map 无法修改

定义一个空的 Map

scala> var m:Map[Char, Int] = Map()
m: Map[Char,Int] = Map()

scala> m += ('a' -> 1)

scala> m += ('b' -> 2)

scala> m += ('c' -> 3)

scala> m
res20: Map[Char,Int] = Map(a -> 1, b -> 2, c -> 3)

直接定义一个键值对的 Map

scala> var m2 = Map("one" -> "111", "two" -> "222")
m2: scala.collection.immutable.Map[String,String] = Map(one -> 111, two -> 222)

scala> m2 += ("three" -> "333")

定义不同类型的 键类型,自动识别 键值是 Any 任何类型的

scala> var m2 = Map("one" -> "111", 'b' -> "222")
m2: scala.collection.immutable.Map[Any,String] = Map(one -> 111, b -> 222)

二、基本操作

  • keys 此方法返回包含映射中每个键的迭代。
  • values 此方法返回一个包含映射中每个值的迭代。
  • isEmpty 如果列表为空,则此方法返回true,否则返回false
scala> m
res30: Map[Char,Int] = Map(a -> 1, b -> 2, c -> 3)

scala> m.keys
res27: Iterable[Char] = Set(a, b, c)

scala> m.values
res28: Iterable[Int] = MapLike(1, 2, 3)

scala> m.isEmpty
res29: Boolean = false

三、连接

可以使用 ++ 运算符或 Map.++() 方法连接两个或多个映射,但在添加映射时,它将删除重复的键

定义两个 Map

scala> var m1 = Map("a" -> 1, "b" -> 2, "c" -> 3)
m1: scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2, c -> 3)

scala> var m2 = Map("d" -> 4, "e" -> 5, "f" -> 6)
m2: scala.collection.immutable.Map[String,Int] = Map(d -> 4, e -> 5, f -> 6)

++ 方式连接

scala> m1 ++ m2
res31: scala.collection.immutable.Map[String,Int] = Map(e -> 5, f -> 6, a -> 1, b -> 2, c -> 3, d -> 4)

Map.++() 方式连接

scala> m1.++(m2)
res32: scala.collection.immutable.Map[String,Int] = Map(e -> 5, f -> 6, a -> 1, b -> 2, c -> 3, d -> 4)

四、打印键和值

scala> m1.keys.foreach( i => println( "key="+i + ", value=" +  m1(i) ) )
key=a, value=1
key=b, value=2
key=c, value=3

五、查找元素

判断键是否存在

scala> m1.contains("a")
res43: Boolean = true