【发布时间】:2014-09-02 08:18:03
【问题描述】:
有没有办法检查Map 是否有定义的默认值?我想要的是 myMap.getOrElse(x, y) 的等价物,如果键 x 不在地图中,
- 如果
myMap有默认值,则返回该值 - 否则返回
y
一个人为的问题示例:
scala> def f(m: Map[String, String]) = m.getOrElse("hello", "world")
f: (m: Map[String,String])String
scala> val myMap = Map("a" -> "A").withDefaultValue("Z")
myMap: scala.collection.immutable.Map[String,String] = Map(a -> A)
scala> f(myMap)
res0: String = world
在这种情况下,我希望 res0 是 "Z" 而不是 "world",因为 myMap 是用它作为默认值定义的。但是getOrElse 不是这样工作的。
我可以使用m.apply 代替m.getOrElse,但不保证映射具有默认值,因此它可能会引发异常(我可以捕获异常,但这并不理想)。
scala> def f(m: Map[String, String]) = try {
| m("hello")
| } catch {
| case e: java.util.NoSuchElementException => "world"
| }
f: (m: Map[String,String])String
scala> val myMap = Map("a" -> "A").withDefaultValue("Z")
myMap: scala.collection.immutable.Map[String,String] = Map(a -> A)
scala> f(myMap)
res0: String = Z
scala> val mapWithNoDefault = Map("a" -> "A")
mapWithNoDefault: scala.collection.immutable.Map[String,String] = Map(a -> A)
scala> f(mapWithNoDefault)
res1: String = world
以上产生了预期值,但看起来很混乱。我无法根据地图是否具有默认值进行模式匹配和调用apply 或getOrElse,因为无论默认值如何,类型都是相同的(scala.collection.immutable.Map[String,String])。
有没有不涉及捕获异常的方法?
【问题讨论】:
标签: scala map default-value