>假设我有以下变量:
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
重复的情况