Scala:收集列表参数传递的哈希图中定义的值



>假设我有以下变量:

val m = HashMap( ("1", "one"), ("2", "two"), ("3", "three") )
val l = List("1", "2")

我想提取列表列表("一","二"(,它对应于映射中存在的列表中每个键的值。

这是我的解决方案,就像一个魅力。我仍然想知道我是否正在重新发明轮子,以及是否有一些惯用的解决方案来做我打算做的事情:

class Mapper[T,V](val map: HashMap[T,V]) extends PartialFunction[T, V]{
override def isDefinedAt(x: T): Boolean = map.contains(x)
override def apply(x: T): V = map.get(x) match {
case Some(v) => v
}
}
val collected = l collect (new Mapper(map) )

列表("一"、"二"(

是的,你正在重新发明轮子。您的代码等效于

l collect m

但是有了额外的间接层,不会给HashMap添加任何东西(它已经实现了PartialFunction- 只需展开"线性超类型"列表即可看到(。


或者,您也可以按如下方式使用flatMap

l flatMap m.get

隐式CanBuildFrom确保结果实际上是List

你可以这样做,这似乎更简单一些:

val res = l.map(m.get(_)) // List(Some("one"), Some("two"))
.flatMap(_.toList)

甚至这个,使用理解:

val res = for {
key <- l
value <- m.get(key)
} yield value

我会建议这样的事情:

m.collect { case (k, v) if l.contains(k) => v }

注意:

  • 不保留订单免受l
  • 不处理l重复的情况

最新更新