Scala Map是否允许重复键?为何定义重复键未报错?
为什么Scala定义重复键的Map时不会报错而是覆盖?
Scala里默认的Map是不可变的scala.collection.immutable.Map,用字面量语法初始化时,遇到重复键不会抛出异常,而是直接用后出现的键值对覆盖先出现的,这是集合库刻意设计的行为,主要原因有两点:
- 字面量构造的易用性设计:这种语法是为了提供简洁的初始化方式,允许开发者在编写字面量时不小心写出重复键的情况下,自动保留最后一个有效值,避免因为小失误导致程序中断。
- 不可变Map的语义匹配:不可变Map的核心语义是"键唯一",但构造时的重复键处理是在实例创建前完成的——最终生成的Map实例里并没有重复键,只是构造过程中自动合并了重复输入。
如果需要在出现重复键时强制抛出错误,可以自己实现检查逻辑,比如:
def createMapWithUniqueKeys[A, B](pairs: (A, B)*): Map[A, B] = { val duplicateKeys = pairs.groupBy(_._1).filter(_._2.size > 1).keys if (duplicateKeys.nonEmpty) { throw new IllegalArgumentException(s"存在重复键:${duplicateKeys.mkString(", ")}") } else { Map(pairs: _*) } } // 测试重复键的情况 val subjects = createMapWithUniqueKeys(1 -> "DS",2 -> "C++", 3 -> "Java", 1-> "DF") // 执行后会抛出异常:java.lang.IllegalArgumentException: 存在重复键:1
内容的提问来源于stack exchange,提问作者chandra prakash kabra
相关产品推荐
相关产品推荐

