Scala嵌套集合分配

时间:2013-01-20 21:15:04

标签: scala collections

我正在尝试在Scala中构建一个从整数到一组可变整数的可变映射。

例如,我想拥有表单1 - >的映射。 (2,3)并且能够更新 他们以后使用键值。我使用的代码如下:

import scala.collection.mutable._

val map = Map[Int, Set[Int]]()
map: scala.collection.mutable.Map[Int,scala.collection.mutable.Set[Int]] = Map()

map += (1 -> Set(2,3))
res15: map.type = Map(1 -> Set(2, 3))

到目前为止很好,但是当我尝试做类似

的事情时
map.get(1) += 4

我得到val错误的分配。令我困惑的是map.get()应该返回一个 可以更新的类型scala.collection.mutable.Set集。有人可以请一些 点亮这里发生了什么?

2 个答案:

答案 0 :(得分:3)

在这种情况下的问题是get()返回一个选项(Option[scala.collection.mutable.Set[Int]]),您需要“解压缩”:

map.get(1).get += 4

Map的get()函数返回一个选项的原因是任何给定键都可能没有值,Scala不喜欢像Java API对应的那样抛出异常。

或者您可以使用apply()方法,该方法直接返回请求的值并在发生故障时抛出异常:

map(1) += 4

我还没弄清楚为什么你会尝试使用你尝试的代码“重新分配val”错误。就我而言(Scala 2.10),它说如下:

<console>:12: error: value += is not a member of Option[scala.collection.mutable.Set[Int]]
          map.get(1) += 1

您使用的是哪个版本的Scala?

答案 1 :(得分:0)

更优雅的方式是

map.get(1).map(_ += 4).getOrElse{map += 1 -> Seq(4)}