2017-01-04 4 views
0

どのようにエレガントなスカラスタイルでマップから要素を取得できますか? try catchは正しく見えません。 には最適なオプションが含まれていますか?スカラ地図java.util.NoSuchElementException:キーが見つかりませんエレガント

パターンマッチを試行しても例外がキャッチされません。

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 
    } 
+2

のために理解するために使用することができ、あなたが欲しい:。 'myMap.get( "のfirstKey")flatMap(。_( "secondKey")を取得)倍(0。 ){case s:String => s.length} ' –

+0

これはうまくいくようです。 –

答えて

2

あなたはおそらくそれ

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

私はこの解決策がよりクリーンだと思います。そして最初のコメントよりも読みやすい。 –

2

デフォルトをもっとエレガントにしてもわかりませんが、例外をキャッチするよりも優れています。

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 
関連する問題