Как сопоставить IndexedSeq с коллекцией Map с коллекцией другого желаемого типа в Scala? - PullRequest
0 голосов
/ 16 марта 2012

Имея

val a: IndexedSeq[String] = Array("one", "two", "three")

def f(s: String): Int = s match {
    case "one" => 1; case "two" => 2; case "three" => 3;
    case _ => throw new IllegalArgumentException
}

как мне лучше узнать

val m: Map[String, Int] = Map("one" -> 1, "two" -> 2, "three" -> 3)

при условии, что я не возражаю против введения прокси-функции для возврата пар ключ-значение в виде кортежей, если это будет лучшим решением.

PS: На самом деле меня интересует, как сопоставить коллекцию с коллекцией другого желаемого типа, но я выбрал этот пример как частный случай, чтобы проиллюстрировать и сделать вопрос более конкретным. Это означает, что решение для конкретного случая (IndexedSeq to Map) является приемлемым, но приветствуются более общие комментарии. Прямо сейчас я использую foreach для заполнения изменяемого буфера карты для таких случаев, но это кажется слишком далеким от истинного функционального способа Scala, ИМХО. Я обнаружил, что использую слишком много foreach и изменяемых буферов, что заставляет меня нервничать, и поэтому я задаю все эти вопросы о отображении.

Ответы [ 2 ]

6 голосов
/ 16 марта 2012

А что не так с:

a map {i => (i, f(i))} toMap

, производящим:

scala.collection.immutable.Map[String,Int] = Map(one -> 1, two -> 2, three -> 3)
3 голосов
/ 16 марта 2012

Это более эффективно, но сложнее для полного понимания. Это позволяет избежать промежуточного IndexedSeq[(String, Int)], созданного map. Просто весело; -)

val result: Map[String, Int] = a.map(i => (i, f(i)))(scala.collection.breakOut)

Смотрите это ТАК сообщение: Scala 2.8 breakOut

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...