scala中的实例Multimap类

时间:2014-05-12 17:59:27

标签: scala collections multimap

Class[T]关联到List[T] s的惯用方法是什么?基本上,我想要相当于Guava的ClassToInstanceMap,但是在Multimap形式中。

我不确定Scala mutable.Multimap如何适应这里。

1 个答案:

答案 0 :(得分:3)

标准库中没有任何内容,但实现起来非常简单(使用ClassTag而不是Class来简化API):

class ClassToInstanceMultiMap private (private val delegate: Map[ClassTag[_], List[_]]) {
  def addInstance[T](x: T)(implicit ct: ClassTag[T]) = 
    new ClassToInstanceMultiMap(delegate + (ct -> x))

  def getInstances[T](implicit ct: ClassTag[T]) = delegate.getOrElse(ct, List.empty).asInstanceOf[List[T]]

  // whatever other methods you want
}

object ClassToInstanceMultiMap {
  val empty = new ClassToInstanceMultiMap()
}

// usage
val cimm = ClassToInstanceMultiMap.empty.addInstance(1).addInstance(2).addInstance("a").getInstances[Int]
// returns List(1, 2)

如果要分别存储具有相同类和不同泛型类型参数(例如TypeTagClassTag)的实例,请使用Option[Int]而不是Option[String]。< / p>