Scala mutable.Map 的增删查用法

36 阅读4分钟

1. 核心概念

 * map 映射 表示一种一一对应关系
 *
 * 1.添加
 * 2.删除
 * 3.查询 对应的值
 * 4.遍历
 */

这部分是ScalaDoc注释,用于说明该对象的功能。 map 映射 表示一种一一对应关系:这是对 Map 数据结构最本质的定义。它非常像一个字典或者一个哈希表,里面存储的是一系列的 键值对 (Key-Value Pair)。 键 (Key):就像字典里的 “字”,必须是唯一的。 值 (Value):就像字典里 “字” 的解释,可以重复。 一一对应:意味着通过一个唯一的键,总能找到一个与之关联的值。 1.添加, 2.删除, 3.查询, 4.遍历:清晰地列出了本示例将要演示的 Map 的四个核心操作。这为我们阅读后续代码提供了明确的指引。

2. 程序入口与 Map 创建

//创建可变的Map  键  值  对
val scores = scala.collection.mutable.Map("alice" -> 90, "bob" -> 85)
val scores = scala.collection.mutable.Map("alice" -> 90, "bob" -> 85)
  • scala.collection.mutable.Map 这指定了我们要创建的 Map 类型。
  • scala.collection //这是 Scala 集合类库的根包。
  • mutable:表示 “可变的”。这意味着 Map 对象创建后,我们可以随时向其中添加、删除或修改键值对。这与scala.collection.immutable.Map形成对比,后者一旦创建,其内容就无法更改。
  • "alice" -> 90 这是 Scala 中创建键值对的一种优雅语法糖
  • 这里:
  1. 键是字符串 "alice",值是整数 90。
  2. 键是字符串 "bob",值是整数 85。
  • val scores:我们用 val 来声明一个引用,val 意味着 scores 这个引用本身不能被重新赋值写 scores = new ,但这并不影响 Map 对象内部状态的改变。这是一个非常重要的区别。

执行完这行代码后,内存中就有了一个 Map 实例,它包含了两个学生的成绩信息。

3. 操作演示

1. 添加

//1. 添加
scores += ("max" -> 100)

这行代码演示了如何向可变 Map 中添加一个新的键值对

  • +=:这是一个运算符重载,在 mutable.Map 的语境下,它的含义是 “添加”
  • ("max" -> 100):这是要被添加的新键值对,表示学生 "max" 的成绩是 100

执行后,scores 地图现在包含了三个条目:"alice" -> 90, "bob" -> 85, "max" -> 100

2. 删除

//2.删除 alice  删除操作是根据key来做的
scores -= "alice"

这行代码演示了如何从 Map 中删除一个键值对

  • -=:同样是一个运算符重载,含义是 “删除”。
  • "alice":删除操作是 根据键(Key)  来进行的。这里我们告诉 Map:“请把键为 "alice" 的那个键值对从你里面移除。”

执行后,scores 地图变回了两个条目:"bob" -> 85, "max" -> 100

3. 查询

    //查询  查看bob的分数  rst是一个Option类型
    val rst = scores.get("bob1")
    if(rst.isEmpty){
      println("bob1没有成绩")
    } else {
      println(rst.get)
    }

这部分代码展示了一种安全的查询方式。

  • scores.get("bob1"):我们调用 Map 的 get 方法,并传入要查询的键 "bob1"
  • 关键点:get 方法的返回值类型是 Option[T](在这里 T 是 Int)Option 是一个容器,它可能包含一个值,也可能不包含任何值
  • 这种设计是为了避免臭名昭著的 NullPointerException 。当你查询一个不存在的键时,get 方法不会返回 null,而是返回一个 None 对象。
  • if(rst.isEmpty):我们检查返回的 Option 对象 rst 是否为空。
  1. 如果 rst 是 None,那么 rst.isEmpty 的结果就是 true。
  2. 如果 rst 是 Some,那么 rst.isEmpty 的结果就是 false。
  • println("bob1没有成绩"):因为我们之前删除了 "alice",添加了 "max"scores 地图里根本没有 "bob1" 这个键。所以 rst 的值是 NoneisEmpty 为 true,这段代码会被执行,打印出 “bob1 没有成绩”
  • else { println(rst.get) }:如果查询的键存在,rst 的值会是 Some(85)。这时 isEmpty 为 falseelse 块会执行。我们通过调用 rst.get 来获取 Option 容器内部包裹的那个值并打印它。

最佳实践:在 Scala 中,强烈推荐使用 get 方法并配合 Option 的模式匹配来处理查询结果,这比直接使用 scores("bob1")更加安全和健壮

例如,更好一些的写法是:

scores.get("bob1") match {
  case Some(score) => println(score)
  case None => println("bob1没有成绩")
}

总结

  • 代码通过一个简单的 “学生成绩管理” 场景,清晰展示了 Scala 中可变 Map 的创建以及增、删、查三种基本操作
  • 展示了 +=-= 等直观的操作符,还引入了 Option 类型这一强大的功能