Scala:收集列表参数传递的hashmap中定义的值

Scala:收集列表参数传递的hashmap中定义的值,scala,list,hashmap,Scala,List,Hashmap,假设我有以下变量: 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,

假设我有以下变量:

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) )
列表(“一”、“二”)


您可以这样做,这似乎有点简单:

val res = l.map(m.get(_)) // List(Some("one"), Some("two"))
           .flatMap(_.toList)
或者甚至是这个,用一个简单的例子来理解:

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

键您可以这样做,这似乎有点简单:

val res = l.map(m.get(_)) // List(Some("one"), Some("two"))
           .flatMap(_.toList)
或者甚至是这个,用一个简单的例子来理解:

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

key我建议如下:

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

  • 不保留
    l
  • 不处理
    l

我建议如下:

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

  • 不保留
    l
  • 不处理
    l

是的,您正在重新发明轮子。您的代码相当于

l collect m
但是增加了一层间接寻址,它不会向HashMap添加任何内容(已经有了,只需扩展“线性超类型”列表即可)


或者,您也可以使用
flatMap
,如下所示:

l flatMap m.get

隐式
可以从
s构建,确保结果实际上是一个
列表
是的,您正在重新发明轮子。您的代码相当于

l collect m
但是增加了一层间接寻址,它不会向HashMap添加任何内容(已经有了,只需扩展“线性超类型”列表即可)


或者,您也可以使用
flatMap
,如下所示:

l flatMap m.get

隐式
CanBuildFrom
s确保结果实际上是一个
列表

,这会在任何具有重复元素的列表上给出完全错误的结果,例如在
val l=List.fill(10)(“1”)上
。即使在没有重复元素的列表上,也不能保证保留顺序。你是对的。有必要在l中处理重复项,但它不会保留在l中定义的顺序。还要感谢你给出了非常好的答案。这在任何有重复元素的列表上都会给出完全错误的结果,例如在
val l=list.fill上(10) (“1”)
。即使在没有重复元素的列表上,也不能保证保留顺序。你是对的。有必要在l中处理重复项,但它不会保留在l中定义的顺序。还要感谢你给出了非常好的答案。哦,太好了哦,太好了