如何知道 Scala 中 Map 值 Map("key->"value") 的类型?
How to know type of Map value Map("key->"value") in Scala?
我对 Map("id") 的值有疑问,它可能有两种类型:String 或 Map[String,String]。
Case 1: val a = Map("id" -> "123")
Case 2: val a = Map("id"-> Map("ide"->"abcd"))
我想像这样检查 Match case :
def d = a.get("id") match {
case _:String => "String"
case _:Map[String,Any] => "Map"
}
有没有人知道我应该如何处理这个案子?
您的代码几乎是正确的。地图上的方法 get
returns 一个 Option
。您需要做的就是将值包装在匹配项中。所以你可以这样做:
val a1 = Map("id" -> "123")
val a2 = Map("id" -> Map("ide" -> "abcd"))
val a3 = Map("id" -> 42)
def d(map: Map[String, Any]) = map.get("id") match {
case Some(_: String) => "String"
case Some(_: Map[String,Any]) => "Map"
case _ => "Other"
}
d(a1) // "String"
d(a2) // "Map"
d(a3) // "Other"
UPD:正如@Luis 所指出的,由于类型擦除,第二种情况将匹配任何 Map
。如果您想匹配特定的 Map
,请参阅他的回答
根据 Dmitry 的回答进行了细微修改。此代码段使用 TypeTag
到 Overcome type erasure。
import scala.reflect.runtime.universe.{TypeTag, typeOf}
def d[T](map: Map[String, T])(implicit T: TypeTag[T]) = map.get("id") match {
case Some(_) if T == typeOf[String] => "String"
case Some(_) if T == typeOf[Map[String, String]] => "Map[String, String]"
case Some(_) => "Other"
case None => "Not found"
}
d(Map("id" -> "Hello")) // String.
d(Map("id" -> Map("Hello" -> "World"))) // Map[String, String].
d(Map("id" -> 10)) // Other.
d(Map("id" -> Map(10 -> true))) // Other.
d(Map.empty) // Not found.
注意,只有在调用该方法时 Map 的所有元素都具有相同类型时,这才有效...
如果您首先有 Map[String, Any]
,这将变得更加复杂 - 德米特里的答案可能会更好。
我对 Map("id") 的值有疑问,它可能有两种类型:String 或 Map[String,String]。
Case 1: val a = Map("id" -> "123")
Case 2: val a = Map("id"-> Map("ide"->"abcd"))
我想像这样检查 Match case :
def d = a.get("id") match {
case _:String => "String"
case _:Map[String,Any] => "Map"
}
有没有人知道我应该如何处理这个案子?
您的代码几乎是正确的。地图上的方法 get
returns 一个 Option
。您需要做的就是将值包装在匹配项中。所以你可以这样做:
val a1 = Map("id" -> "123")
val a2 = Map("id" -> Map("ide" -> "abcd"))
val a3 = Map("id" -> 42)
def d(map: Map[String, Any]) = map.get("id") match {
case Some(_: String) => "String"
case Some(_: Map[String,Any]) => "Map"
case _ => "Other"
}
d(a1) // "String"
d(a2) // "Map"
d(a3) // "Other"
UPD:正如@Luis 所指出的,由于类型擦除,第二种情况将匹配任何 Map
。如果您想匹配特定的 Map
根据 Dmitry 的回答进行了细微修改。此代码段使用 TypeTag
到 Overcome type erasure。
import scala.reflect.runtime.universe.{TypeTag, typeOf}
def d[T](map: Map[String, T])(implicit T: TypeTag[T]) = map.get("id") match {
case Some(_) if T == typeOf[String] => "String"
case Some(_) if T == typeOf[Map[String, String]] => "Map[String, String]"
case Some(_) => "Other"
case None => "Not found"
}
d(Map("id" -> "Hello")) // String.
d(Map("id" -> Map("Hello" -> "World"))) // Map[String, String].
d(Map("id" -> 10)) // Other.
d(Map("id" -> Map(10 -> true))) // Other.
d(Map.empty) // Not found.
注意,只有在调用该方法时 Map 的所有元素都具有相同类型时,这才有效...
如果您首先有 Map[String, Any]
,这将变得更加复杂 - 德米特里的答案可能会更好。