Получение значений из приведенного списка карт ключей в Scala

В принципе мне нужно получить набор значений из карты для ключей в данном списке (в том же порядке указаны ключи).

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

Вопрос не так важен, конечно, просто пытается исследовать хороший стиль.

Ответ 1

Использовать 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.

Ответ 2

Или:

ks collect kv

Результат состоит из всех значений kv, для которых ключ находится в ks.

(Помимо функции, Map также является PartialFunction)