Scala多重映射:获取项或获取空集

Scala多重映射:获取项或获取空集,scala,multimap,Scala,Multimap,如果我正在使用Scala多重映射,并且我想要获得与键或空集相关联的值,那么我必须编写以下代码吗 multimap.getOrElse("key", new collection.mutable.HashSet()) 看起来,下面的方法应该是有效的。空集似乎是一个很好的默认值 multimap.getOrElse("key") 正如您所观察到的,MultiMap特性并不能满足您的需要。但是,如果映射是特定可变或不可变的,则可以自己添加默认值。举个例子 scala> val m = col

如果我正在使用Scala多重映射,并且我想要获得与键或空集相关联的值,那么我必须编写以下代码吗

multimap.getOrElse("key", new collection.mutable.HashSet())
看起来,下面的方法应该是有效的。空集似乎是一个很好的默认值

multimap.getOrElse("key")

正如您所观察到的,
MultiMap
特性并不能满足您的需要。但是,如果映射是特定可变或不可变的,则可以自己添加默认值。举个例子

scala> val m = collection.mutable.Map(1 -> 2)
m: scala.collection.mutable.Map[Int,Int] = Map(1 -> 2)

scala> val m2 = m.withDefaultValue(42)
m2: scala.collection.mutable.Map[Int,Int] = Map(1 -> 2)

scala> m2(1)
res0: Int = 2

scala> m2(2)
res1: Int = 42

奇怪的是,如果
m
的类型是抽象的
collection.Map
,上述方法就行不通了。源代码中的注释表示这是由于差异问题。

此用例可以使用
with defaultvalue
。例如:

import collection.mutable._
val multimap = Map[String, HashSet[String]]() withDefaultValue(new HashSet())
scala> multimap("key")
// res1: scala.collection.mutable.HashSet[String] = Set()

通常您会使用
Map.withDefaultValue
进行此操作。但是,看起来您似乎无法真正获得此行为,并且仍然将集合键入为a
MultiMap[a,B]
MultiMap.withDefaultValue
的返回类型是
Map[A,Set[B]]
。因此,不幸的是,您必须放弃使用MultiMap mixin来获得所需的行为。

因为,as,
with defaultvalue
在使用mixin时没有保留正确的
MultiMap
类型,您可以替代匿名类中的
default
方法,并保留
MultiMap
的行为:

scala> import collection.mutable.{ HashMap, MultiMap, Set }
import collection.mutable.{HashMap, MultiMap, Set}

scala> val map: MultiMap[String, Int] = new HashMap[String, Set[Int]] with MultiMap[String, Int] {
     |   override def default(key: String): Set[Int] = Set.empty[Int]
     | }
map: scala.collection.mutable.MultiMap[String,Int] = Map()

scala> map("foo")
res0: scala.collection.mutable.Set[Int] = Set()

scala> map.addBinding("foo", 1)
res1: map.type = Map(foo -> Set(1))

scala> map("foo")
res2: scala.collection.mutable.Set[Int] = Set(1)

六羟甲基三聚氰胺六甲醚。。。这将是伟大的,如果getOrElse(关键)被添加!这似乎不像预期的那样有效<代码>多重映射(“键”)+=“值”不会修改映射。我猜默认值不会被缓存。