有没有办法检查Map
是否有定义的默认值?我想是的myMap.getOrElse(x, y)
一些等价其中,如果关键x
是不是在地图上,如何判断Map是否有默认值?
- 如果
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]
)。
有没有办法做到这一点,不涉及捕捉异常?
哦,'Map.WithDefault'就是我一直在寻找的东西。谢谢! – Walfie
请注意,这仍然是一种恶心 - 地图不是静态类型为“WithDefault”,所以我们必须使用反射。这不是那种可能导致显着性能损失的反思,但它仍然很不理想。 –