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 中创建键值对的一种优雅语法糖- 这里:
- 键是字符串
"alice",值是整数 90。 - 键是字符串
"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是否为空。
- 如果 rst 是 None,那么 rst.isEmpty 的结果就是 true。
- 如果 rst 是 Some,那么 rst.isEmpty 的结果就是 false。
println("bob1没有成绩"):因为我们之前删除了"alice",添加了"max",scores地图里根本没有"bob1"这个键。所以rst的值是None,isEmpty为true,这段代码会被执行,打印出“bob1 没有成绩”。else { println(rst.get) }:如果查询的键存在,rst的值会是Some(85)。这时isEmpty为false,else块会执行。我们通过调用rst.get来获取Option容器内部包裹的那个值并打印它。
最佳实践:在 Scala 中,强烈推荐使用 get 方法并配合 Option 的模式匹配来处理查询结果,这比直接使用 scores("bob1")更加安全和健壮
例如,更好一些的写法是:
scores.get("bob1") match {
case Some(score) => println(score)
case None => println("bob1没有成绩")
}
总结
- 代码通过一个简单的 “学生成绩管理” 场景,清晰展示了
Scala中可变Map的创建以及增、删、查三种基本操作 - 展示了
+=,-=等直观的操作符,还引入了Option类型这一强大的功能