有没有办法检查是否Map
有定义的默认值吗?我想要的是相当于myMap.getOrElse(x, y)
如果关键在哪里x
不在地图上,
该问题的一个人为示例:
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
to be "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
or getOrElse
基于映射是否有默认值,因为类型是相同的(scala.collection.immutable.Map[String,String]
)无论默认性如何。
有没有一种方法可以做到这一点而不涉及捕获异常?