如何定义任意String键返回同一值的Map以调用指定Scala方法?
实现任意String键返回同一值的Scala Map
要实现这种“任意String键都返回固定值”的Map,在Scala里有两种实用方案,你可以根据对Map语义的需求来选择:
方案1:轻量实现(仅适配括号访问apply)
如果只需要通过m(key)这种括号访问的方式返回固定值,不需要get方法也返回对应的值,用withDefault方法最便捷:
def test(m: Map[String, Int]): Unit = { // 示例逻辑:打印任意键对应的值 println(m("random-key")) println(m("")) } // 定义一个所有不存在的键都返回1的Map val m: Map[String, Int] = Map.empty.withDefault(_ => 1) // 调用测试方法 test(m) // 输出: // 1 // 1
测试验证:
m("a") // res0: Int = 1 m("b") // res1: Int = 1 m("") // res2: Int = 1
注意:这种方式下,m.get("a")会返回None,因为底层还是空Map,只有当你用括号访问不存在的键时,才会触发默认值逻辑。
方案2:完整Map语义实现(所有操作都返回固定值)
如果需要get方法也返回Some(1),或者希望Map的其他操作(比如contains、iterator等)都符合“所有键对应同一个值”的语义,那可以自定义一个Map的实现:
def test(m: Map[String, Int]): Unit = { println(m("test-key")) println(m.get("another-key")) } // 自定义Map,所有键都返回1 val m: Map[String, Int] = new Map[String, Int] { // 不管什么键,get都返回Some(1) override def get(key: String): Option[Int] = Some(1) // 迭代器返回空(因为没有实际存储的键值对,按需调整) override def iterator: Iterator[(String, Int)] = Iterator.empty // 添加新键值对不改变Map,保持所有键返回1 override def +[B1 >: Int](kv: (String, B1)): Map[String, B1] = this // 删除键也不改变Map override def -(key: String): Map[String, Int] = this } test(m) // 输出: // 1 // Some(1)
如果需要contains方法也返回true,可以额外重写这个方法:
override def contains(key: String): Boolean = true
关于你示例里的Map((???, 1))
???是Scala里的占位符,调用它会直接抛出NotImplementedError,所以不能用来实现这个需求,上面的两种方案才是可行的解决办法。
内容的提问来源于stack exchange,提问作者Vadim
相关产品推荐
相关产品推荐

