加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何判断Map是否具有默认值?

发布时间:2020-12-16 10:04:49 所属栏目:安全 来源:网络整理
导读:有没有办法检查Map是否有定义的默认值?我想要的是myMap.getOrElse(x,y)的等价物,如果键x不在地图中, 如果myMap有默认值,则返回该值 否则返回y 一个人为的例子: scala def f(m: Map[String,String]) = m.getOrElse("hello","world")f: (m: Map[String,Strin
有没有办法检查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] = 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的实例:

implicit class EnrichedMap[K,V](m: Map[K,V]) {
  def getOrDefaultOrElse(k: K,v: => V) =
    if (m.isInstanceOf[Map.WithDefault[K,V]]) m(k) else m.getOrElse(k,v)
}

然后:

scala> val myMap = Map("a" -> "A").withDefaultValue("Z")
myMap: scala.collection.immutable.Map[String,String] = Map(a -> A)

scala> myMap.getOrDefaultOrElse("hello","world")
res11: String = Z

scala> val myDefaultlessMap = Map("a" -> "A")
myDefaultlessMap: scala.collection.immutable.Map[String,String] = Map(a -> A)

scala> myDefaultlessMap.getOrDefaultOrElse("hello","world")
res12: String = world

这种反射是否比使用非异常控制流的异常更好是一个悬而未决的问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读