基本上我需要从地图中获取给定列表中的键的一组值(以相同的顺序键给出)。
val kv = Map("k3" -> "v3", "k1" -> "v1", "k2" -> "v2")
val ks = List("k1", "k2")
我能做到的最好的事情是foldRight
超过ks
:
scala> (ks foldRight List[String]()) { (v, a) => kv(v) :: a }
res7: List[String] = List(v1, v2)
有没有更方便的方法可以在标准库中执行此操作或只使用较短的代码,理想情况下类似kv getVals ks
? :)
问题当然不是那么重要,只是试图探索良好的风格。
答案 0 :(得分:20)
或者:
ks collect kv
结果由kv的所有kv值组成。
(除了作为一个函数,Map也是一个PartialFunction)
答案 1 :(得分:16)
使用flatMap:
ks flatMap { k => kv get k }
或更好:
ks flatMap (kv get)
并for
理解:
for (k <- ks; v <- kv get k) yield v
但没有一个像你自己的单行一样简洁或明确: - )
ks map kv
List("k42") map kv // will barf
但请注意,这是例外情况 - 如果ks
包含未在地图kv
中定义的密钥,则可能会引发异常。