Как узнать тип значения карты Map ("ключ ->" значение ") в Scala? - PullRequest
0 голосов
/ 20 января 2019

У меня проблема со значением Map ("id"), оно может иметь два типа: String или Map [String, String].

Case 1: val a = Map("id" -> "123")
Case 2: val a = Map("id"-> Map("ide"->"abcd"))

Я хочу сделать чек с регистром соответствия следующим образом:

def d = a.get("id") match {

  case _:String => "String"
  case _:Map[String,Any] => "Map"


}

Кто-нибудь имеет представление о том, как я должен справиться с этим делом?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Слегка модифицировано от ответа Дмитрия.Этот фрагмент кода использует TypeTag до Overcome стирание типа .

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[String, Any], во-первых, это становится более сложным - и, вероятно, Дмитрий будет лучше.

0 голосов
/ 21 января 2019

Ваш код почти правильный.Метод get на карте возвращает 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...