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有默认值,则返回该值 一个人为的例子: 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 这种反射是否比使用非异常控制流的异常更好是一个悬而未决的问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- twitter-bootstrap – bootstrap 4样式选择
- 如何使用Jasmine为私有方法编写Angular / TypeScript单元测
- CXF webservice的简单使用
- Bootstrap-Modal升级到CSS3后,模态层不完全消失的解决办法
- scala – 每次都在我的网络应用程序的标题中显示登录用户信
- Bootstrap 3.2.0 源码试读 2014/08/04
- scala.collection.immutable.WrappedString需要一个隐式的C
- bootstrap 打印时表格颜色设置
- 在vim中以制表符分隔的文本文件中重新排列列的最佳方法是什
- 记录项目版本升级angular4 ~ angular5