2017-05-17 1 views
0

Ich habe eine Karte in Scala von einer Funktion zurück die vom Typ ist Map[String, Any]Alle Datentyp Griff dynamisch in Scala

Zum Beispiel:

val map: Map[String, Any] = Map("key1" -> "strVal", "key2" -> List[Map[String, Any]](), "key3" -> Map("k1" -> "v1")) 

Nun das Problem ist, auf dem Wert I zu arbeiten, Entspricht einem Schlüssel, muss ich jedes Mal asInstanceOf[] verwenden. Für zB

val key2Hash = map.getOrElse("key3", Map()).getOrElse("k1", "") 

wirft Fehler, weil die abgerufene Karte von Form ist Any und ich habe asInstanceOf[] für jede Situation als belows verwenden:

val key2Hash = map.getOrElse("key3", Map()).asInstanceOf[Map[String, String]].getOrElse("k1", "") 

Gibt es einen besseren Weg, es zu tun? Oder sollte ich nicht mit Map[String, Any] an erster Stelle beginnen?

+1

Wenn es nur zwei Datentypen sind Sie entweder [A, B] verwenden könnten Ihre Daten darzustellen. –

+0

Es ist am besten, 'Any' zu vermeiden, wenn Sie können. Wenn dies nicht möglich ist, können Sie einen Mustervergleich durchführen. Es ist 'IsInstanceOf' +' asInstanceOf' hinter den Kulissen, aber es ist mehr idiomatisch. – slouc

Antwort

3

Map[String, Any]? Sie können Python auch direkt benutzen!

Scherz beiseite, können Sie „schöner“ wirft Syntax Pattern-Matching erhalten:

map.get("key3") match { 
    case Some(anotherMap: Map[String, String]) => ... 
    case _ => ... 
}