5

假设我有

import scala.collection.immutable.TreeMap

val tree = new TreeMap[String, List[String]]

现在在上述声明之后,我想将键“k1”分配给 List(“foo”,“bar”),然后我如何获取或读回键“k1”并读回不存在的键“k2”?

如果我尝试读取不存在的键 "k2" 会发生什么?

4

1 回答 1

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"

可以使用applyscala 语法糖的方法直接访问它,因此您可以使用括号进行访问:

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。我可以用可选结果做什么?好吧,您可以使用方法mapflatMapfilter和。尽量避免对其进行模式匹配,或直接使用该方法!collectgetOrElseOption.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) }

这对于您的用例可能是不可能的

于 2011-06-21T09:14:01.980 回答