假设我具有以下变量:
val m = HashMap( ("1", "one"), ("2", "two"), ("3", "three") )
val l = List("1", "2")
我想提取列表List(“ one”,“ two”),它对应于地图中列表中每个键的值。
这是我的解决方案,就像一个护身符。仍然我想知道我是否正在重新发明轮子,以及是否有一些惯用的解决方案来完成我打算做的事情:
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) )
列表(“一个”,“两个”)
答案 0 :(得分:3)
是的,您正在重新发明轮子。您的代码等同于
l collect m
,但是有一个间接层,它不会向HashMap
添加任何东西(已经implements PartialFunction
了,只需展开“线性超类型”列表就可以看到)。
或者,您也可以如下使用flatMap
:
l flatMap m.get
隐式的CanBuildFrom
确保结果实际上是List
。
答案 1 :(得分:2)
您可以执行此操作,这似乎更简单:
val res = l.map(m.get(_)) // List(Some("one"), Some("two"))
.flatMap(_.toList)
甚至,使用理解:
val res = for {
key <- l
value <- m.get(key)
} yield value
答案 2 :(得分:0)
我建议这样的事情:
m.collect { case (k, v) if l.contains(k) => v }
注意:
l
的订单l
中重复的情况