Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting values from Map given list of keys in Scala

Tags:

list

map

scala

Basically I need to get a set of values from a map for a keys in a given list (in the same order keys are given).

val kv = Map("k3" -> "v3", "k1" -> "v1", "k2" -> "v2")
val ks = List("k1", "k2")

The best I could have improvised is foldRight over ks:

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

Are there any more convenient ways to do this in standard lib or just the shorter code, ideally something alike kv getVals ks? :)

Question is not so important of course, just trying to explore towards good style.

like image 969
dmitry Avatar asked Jan 31 '13 10:01

dmitry


2 Answers

Or:

ks collect kv

The result is composed of all the values of kv for which a key is in ks.

(Besides being a Function a Map is also a PartialFunction)

like image 96
jrmn Avatar answered Oct 04 '22 03:10

jrmn


Use flatMap:

 ks flatMap { k => kv get k }

Or better:

 ks flatMap (kv get)

And with for comprehensions:

for (k <- ks; v <- kv get k) yield v

But none are as succinct or as clear as your own one-liner: :-)

ks map kv
List("k42") map kv // will barf

However, note that this is exceptional - it may throw an exception if ks contains a key not defined in the map kv.

like image 44
Faiz Avatar answered Oct 04 '22 03:10

Faiz