scala map java.util.NoSuchElementException:找不到键

scala map java.util.NoSuchElementException:找不到键,scala,dictionary,exception,pattern-matching,Scala,Dictionary,Exception,Pattern Matching,如何以优雅的scala风格从映射中检索元素? 试一试似乎不太合适。 带有的支票是否包含最佳选项 尝试模式匹配不会捕获异常 case class SomeClass(first: Int, second:String) val someClass = SomeClass(1, "foo") val myMap = Map("firstKey" -> Map("secondKey" -> someClass)) myMap(("col1"))("XXX") match { cas

如何以优雅的scala风格从映射中检索元素? 试一试似乎不太合适。 带有的支票是否包含最佳选项

尝试模式匹配不会捕获异常

case class SomeClass(first: Int, second:String)
val someClass = SomeClass(1, "foo")
val myMap = Map("firstKey" -> Map("secondKey" -> someClass))
myMap(("col1"))("XXX") match {
    case s:String => s.first
    case _ => 0
  }

我不知道您是否发现默认值更优雅,但它们比捕获异常要好

val myMap = Map("firstKey" -> 
                 Map("secondKey" -> "someValue").withDefaultValue(""))
                            .withDefaultValue(Map().withDefaultValue(""))

myMap("firstKey")("secondKey").length  // res0: Int = 9
myMap("firstKey")("secondK").length    // res1: Int = 0
myMap("firstK")("secondKey").length    // res2: Int = 0

我不知道您是否发现默认值更优雅,但它们比捕获异常要好

val myMap = Map("firstKey" -> 
                 Map("secondKey" -> "someValue").withDefaultValue(""))
                            .withDefaultValue(Map().withDefaultValue(""))

myMap("firstKey")("secondKey").length  // res0: Int = 9
myMap("firstKey")("secondK").length    // res1: Int = 0
myMap("firstK")("secondKey").length    // res2: Int = 0

你可以用它来理解它

val length = for(col1 <- myMap.get("col1");
                 str <- col1.get("XXX")) yield str.first
val res = length.getOrElse(0)

val length=for(col1可用于理解

val length = for(col1 <- myMap.get("col1");
                 str <- col1.get("XXX")) yield str.first
val res = length.getOrElse(0)

val length=for(可能是col1,您需要:
myMap.get(“firstKey”).flatMap(u.get(“secondKey”)).fold(0){case s:String=>s.length}
这似乎有效。可能,您需要:
myMap.get(“firstKey”).flatMap(u.get(“secondKey”)).fold(0){case s:String=>s.length}
这似乎有效。我认为这个解决方案更干净。比第一条注释更可读。我认为这个解决方案更干净。比第一条注释更可读。