15

基本上我需要从给定列表中的键的映射中获取一组值(以相同的顺序给出键)。

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

问题当然不是那么重要,只是试图朝着好的风格去探索。

4

2 回答 2

28

或者:

ks collect kv

结果由键在 ks 中的所有 kv 值组成。

(除了是一个函数之外,地图也是一个 PartialFunction)

于 2013-01-31T19:29:07.230 回答
21

使用平面地图:

 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但是,请注意这是异常的 - 如果包含未在 map 中定义的键,它可能会引发异常kv

于 2013-01-31T10:16:53.137 回答