假设我有
import scala.collection.immutable.TreeMap
val tree = new TreeMap[String, List[String]]
现在在上述声明之后,我想将键“k1”分配给 List(“foo”,“bar”),然后我如何获取或读回键“k1”并读回不存在的键“k2”?
如果我尝试读取不存在的键 "k2" 会发生什么?
“变异”不可变映射的最佳方法是在变量中引用它(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 语法糖的方法直接访问它,因此您可以使用括号进行访问:
val l = tree("k1") //equivalent to tree.apply("k1")
但是,我很少访问这样的地图,因为该方法会抛出一个MatchError
键不存在的问题。改为使用get
,它返回一个Option[V]
whereV
是值类型:
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
编辑:构建 Map 而不将其声明为 a 的一种方法var
,并假设您通过转换一些单独的集合来执行此操作,是通过折叠来执行此操作。例如:
//coll is some collection class CC[A]
//f : A => (K, V)
val m = (TreeMap.empty[K, V] /: coll) { (tree, c) => tree + f(c) }
这对于您的用例可能是不可能的