假设我有
import scala.collection.immutable.TreeMap
val tree = new TreeMap[String, List[String]]
现在在上述声明之后,我想将键“k1”分配给List(“foo”,“bar”) 然后我如何获取或读回密钥“k1”并回读不存在的密钥“k2”?
如果我尝试读取不存在的密钥“k2”会发生什么?
答案 0 :(得分:11)
“突变”不可变地图的最佳方法是在变量(var
而不是val
)中引用它:
var tree = TreeMap.empty[String, List[String]]
tree += ("k1" -> List("foo", "bar")) //a += b is sugar for "c = a + b; a = c"
可以使用apply
方法直接访问它,其中scala语法糖启动,因此您只需使用parens进行访问:
val l = tree("k1") //equivalent to tree.apply("k1")
但是,我很少访问这样的地图,因为该方法将抛出MatchError
,因为密钥不存在。请改用get
,返回Option[V]
,其中V
是值类型:
val l = tree.get("k1") //returns Option[List[String]] = Some(List("foo", "bar"))
val m = tree.get("k2") //returns Option[List[String]] = None
在这种情况下,缺少密钥的值为None
。使用可选结果我该怎么办?好吧,您可以使用方法map
,flatMap
,filter
,collect
和getOrElse
。尝试并避免使用模式匹配,或直接使用Option.get
方法!
例如:
val wordLen : List[Int] = tree.get("k1").map(l => l.map(_.length)) getOrElse Nil
编辑:构建地图的一种方式,而不将其声明为var
,并假设您通过转换某个单独的集合来实现此目的,就是通过折。例如:
//coll is some collection class CC[A]
//f : A => (K, V)
val m = (TreeMap.empty[K, V] /: coll) { (tree, c) => tree + f(c) }
这可能不适用于您的用例