Scala Map集合完全指南:从入门到实战应用

导入

在 Scala 中,集合体系与 Python 不同:没有直接名为 Set 的需导入基础类------Set 是 Scala 标准库的核心集合(位于 scala.collection 包下),默认无需手动导入即可使用。但需注意 Scala 的 Set 分为不可变(默认)和可变两种。本文将具体从格式定义到常见操作来讲述集合 Set。

一、Map的定义和创建

定义

Map(映射)是Scala中一种存储键值对(key-value)的数据结构,每个键在Map中是唯一的,通过键可以快速查找到对应的值。

好处

  • 快速查找:通过键可以在常数时间内访问对应的值
  • 数据关联:能够建立有逻辑关联的数据结构
  • 类型安全:编译时检查键值类型
  • 灵活性:支持可变和不可变两种实现方式

语法

scala 复制代码
// 不可变Map
val mapName: Map[KeyType, ValueType] = Map(key1 -> value1, key2 -> value2,...)

// 可变Map (需导入scala.collection.mutable.Map)
val mapName: mutable.Map[KeyType, ValueType] = mutable.Map(key1 -> value2,...)

二、Map的基本操作

案例一:可变Map与不可变Map的基本操作

代码

scala 复制代码
package map

/*
 * Map,映射,表示一种一一对应关系!
 */
object map01 {
  def main(args: Array[String]): Unit = {
    // 创建可变的Map 键 值 对
    val scores = scala.collection.mutable.Map("alice" -> 90, "bob" -> 85)
    // 添加
    scores += ("max" -> 100)

    println(scores)

    // 创建不可变的Map
    val provinceInfo = scala.collection.immutable.Map("42" -> "湖北")
    // provinceInfo += ("14" -> "山西")
    val newInfo = provinceInfo + ("14" -> "山西")
    println(newInfo)
  }
}

结果展示

代码分析

  1. 可变Map创建 :使用scala.collection.mutable.Map创建可变Map,初始包含"alice"和"bob"的成绩
  2. 添加操作 :使用+=操作符直接向可变Map添加"max"的成绩,这会修改原Map
  3. 不可变Map创建 :使用scala.collection.immutable.Map创建不可变Map
  4. 不可变Map添加 :通过+操作符创建新的Map,原Map保持不变,体现了不可变集合的特性
  5. 键值对语法 :使用->操作符创建键值对,语法清晰直观

案例二:Map的增删改查操作

代码

scala 复制代码
package map
9
/*
*
* Map, 映射,表示一种一一对应关系
* 1. 添加
* 2. 删除
* 3. 查询,对应的值
* 4. 遍历,把所有的数据,依次访问
* */
object map02 {
  def main(args: Array[String]): Unit = {
    // 创建可变的Map  键  值  对
    val scores = scala.collection.mutable.Map("alice" -> 90, "bob1" -> 85)
    // 1. 添加
    scores += ("map" -> 100)

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

    // 3. 查询。查看bob的分数. rst 是一个Option类型
    val rst = scores.get("bob1")
    if (rst.isEmpty){
      println("bob1没有成绩")
    } else {
      println(rst.get)
    }
    // 4. 打印scores
    println(scores)
    // 第二种方法 for
    for ((key,value) <- scores){
      println(s"${key}, ${value}分")
    }

    // 第二种方法 foreach
    scores.foreach({
      case (key,value) => println(s"${key}, ${value}分")
    })
  }
}

结果展示

代码分析

  1. 添加元素 :使用+=操作符添加新的键值对"map" -> 100
  2. 删除元素 :使用-=操作符根据键删除"alice"对应的条目
  3. 查询元素
    • 使用get方法查询,返回Option类型,安全处理可能不存在的键
    • 通过isEmpty判断是否存在,避免空指针异常
    • 使用get方法从Option中提取实际值
  4. 遍历方式一 :使用for循环配合模式匹配,直接解构键值对
  5. 遍历方式二 :使用foreach方法配合case语句,函数式风格遍历
  6. 输出格式 :使用字符串插值s"${key}, ${value}分"格式化输出

三、Map的常用方法详解

添加元素

可变Map

  • +=操作符:map += (key -> value)
  • put方法:map.put(key, value)

不可变Map

  • +操作符:val newMapName: Map[KeyType, ValueType] = oldMapName + (newKey ->newValue)(创建新Map)

查询元素

  • get方法:val valueOption: Option[ValueType] = mapName.get(key) ,返回Option[ValueType],安全查询
  • 直接访问:map(key),键不存在时抛出异常

删除元素(仅可变Map)

  • -=操作符:mapName -= key
  • remove方法:mapName.remove(key)

遍历Map

scala 复制代码
// for循环遍历
for ((key, value) <- map) {
    println(s"$key: $value")
}

// foreach方法遍历
map.foreach { case (key, value) =>
    println(s"$key: $value")
}

四、总结

通过本篇文章的学习,我们全面掌握了Scala中Map集合的核心知识:

核心要点

  1. 两种Map类型:可变Map允许原地修改,不可变Map操作后返回新集合
  2. 安全查询 :使用get方法配合Option类型避免运行时异常
  3. 多种遍历 :支持for循环和foreach两种遍历方式
  4. 丰富操作:提供完整的增删改查API
相关推荐
李慕婉学姐19 小时前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue
m0_7400437319 小时前
SpringBoot05-配置文件-热加载/日志框架slf4j/接口文档工具Swagger/Knife4j
java·spring boot·后端·log4j
招风的黑耳20 小时前
我用SpringBoot撸了一个智慧水务监控平台
java·spring boot·后端
Miss_Chenzr20 小时前
Springboot优卖电商系统s7zmj(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
期待のcode20 小时前
Springboot核心构建插件
java·spring boot·后端
2501_9216494920 小时前
如何获取美股实时行情:Python 量化交易指南
开发语言·后端·python·websocket·金融
serendipity_hky21 小时前
【SpringCloud | 第5篇】Seata分布式事务
分布式·后端·spring·spring cloud·seata·openfeign
五阿哥永琪21 小时前
Spring Boot 中自定义线程池的正确使用姿势:定义、注入与最佳实践
spring boot·后端·python
Victor3561 天前
Netty(16)Netty的零拷贝机制是什么?它如何提高性能?
后端
Victor3561 天前
Netty(15)Netty的线程模型是什么?它有哪些线程池类型?
后端