Получение значений из приведенного списка карт ключей в 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)