从Scala中获取键的列表中的值获取值

dmi*_*try 12 scala list map

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

val kv = Map("k3" -> "v3", "k1" -> "v1", "k2" -> "v2")
val ks = List("k1", "k2")
Run Code Online (Sandbox Code Playgroud)

我能做到的最好的即兴创作foldRight结束了ks:

scala> (ks foldRight List[String]()) { (v, a) => kv(v) :: a }
res7: List[String] = List(v1, v2)
Run Code Online (Sandbox Code Playgroud)

有没有更方便的方法在标准库中执行此操作或只是更短的代码,理想情况下类似的东西kv getVals ks?:)

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

小智 20

要么:

ks collect kv
Run Code Online (Sandbox Code Playgroud)

结果由kv的所有kv值组成,其中键为ks.

(除了作为一个函数,一个Map也是一个PartialFunction)

  • 很好,当键可能丢失时,`collect`恰好是安全的变体。 (2认同)

Fai*_*aiz 17

使用flatMap:

 ks flatMap { k => kv get k }
Run Code Online (Sandbox Code Playgroud)

或更好:

 ks flatMap (kv get)
Run Code Online (Sandbox Code Playgroud)

并且for理解:

for (k <- ks; v <- kv get k) yield v
Run Code Online (Sandbox Code Playgroud)

但没有一个像你自己的单行简洁或清晰:(-)

ks map kv
List("k42") map kv // will barf
Run Code Online (Sandbox Code Playgroud)

但请注意,这是例外情况 - 如果ks包含未在地图中定义的键,则可能会抛出异常kv.

  • 我的上帝,它的工作就像`ks map kv`,我是如此盲目:) (3认同)