有效地访问地图内的地图并处理可能的异常

Soh*_*aib 0 scala nested hashmap

我有一个从JSON构建的某个地图,它有一些层次结构.例如:

"2015-05": {
    "129557": {          
        "123456": 3,
        "654321": 2,
        "143526": 1
     }
}
Run Code Online (Sandbox Code Playgroud)

它存储为嵌套映射.我想要一个简单的方法来访问密钥.我可以在每个键上进行多次检查,然后查看它是否存在,然后为第二个键执行,依此类推.然而,这似乎很麻烦.我选择做这样的事情:

def getNumFromMap(key1: String, key2: Int, key3: String): Option[Int] ={
  try{
    map(key1)(key2).get(key3)
  }catch{
    case e: Exception => None
  }
}
Run Code Online (Sandbox Code Playgroud)

此功能可能会被执行数百万次.使用try/catch会降低执行速度吗?有没有更好的方法来实现相同的更快?

Pet*_*ens 8

用于理解:

type MMMap[K1, K2, K3, V] = Map[K1, Map[K2, Map[K3, V]]]

def getFromMMMap[K1, K2, K3, V](
  mmmap: MMMap[K1, K2, K3, V], k1: K1, k2: K2, k3: K3
) : Option[V] =
  for {
    mmap <- mmmap.get(k1)
    map <- mmap.get(k2)
    v <- map.get(k3)
  } yield v
Run Code Online (Sandbox Code Playgroud)

对于MMMap[String, Int, String, Int]:

val mmmap = Map ("a" -> Map(1 -> Map("b" -> 2)))
scala> getFromMMMap(mmmap, "a", 1, "b")
res7: Option[Int] = Some(2)
Run Code Online (Sandbox Code Playgroud)