转发容器内容的简单方法

时间:2014-01-21 19:27:17

标签: scala scala-collections downcast

我经常发现自己在做类似的事情:

val json:Map[String,Any] = getJSON(...)

val v = json.get("username")
val uname = if ( v!=null ) v.asInstanceOf[toString] ) else null

而我更喜欢写的是:

val uname = json.get[String]("username")

get 不接受类型参数 - 所以我的代码过于冗长,如下所示:

val uname = json.get("username").asInstanceOf[String]

如何在这种情况下简化对容器的访问? (对于JSON风格的对象,我这样做很多)

1 个答案:

答案 0 :(得分:1)

使用implicits

可以轻松实现
implicit class MapWGet(m: Map[String, Any]) {
  // something like this
  def gett[T](k: String): T = m(k).asInstanceOf[T]
}

但要注意,asInstance null上的值类型(IntDouble等)会产生零值(但您可以轻松修改方法以满足您的要求)。

scala> val json: Map[String, Any] = Map("s" -> "String", "i" -> 1, "n" -> null, "d" -> 0.10D)
json: Map[String,Any] = Map(s -> String, i -> 1, n -> null, d -> 0.1)

scala> json.gett[String]("s")
res0: String = String

scala> json.gett[String]("n")
res1: String = null

scala> json.gett[Int]("n")
res2: Int = 0

scala> json.gett[Double]("d")
res3: Double = 0.1

scala> json.gett[Int]("i")
res4: Int = 1