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

时间:2018-09-16 18:14:44

标签: scala list hashmap

假设我具有以下变量:

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) )
  

列表(“一个”,“两个”)

3 个答案:

答案 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中重复的情况