Подтвердить что ты не робот

Scala Карта из кортежа iterable

scala.collection.Map из других коллекций, я постоянно пишу:

val map = Map(foo.map(x=>(x, f(x)))

Тем не менее, это на самом деле не работает, так как Map.apply принимает только переменные аргументы - поэтому я должен написать:

val map = Map(foo.map(x=>(x, f(x)) toSeq :_*)

чтобы получить то, что я хочу, но это кажется болезненным. Есть ли более красивый способ построить Map из Iterable кортежа?

4b9b3361

Ответ 1

Используйте TraversableOnce.toMap, который определяется, если элементы Traversable/Iterable имеют тип Tuple2. (API)

val map = foo.map(x=>(x, f(x)).toMap

Ответ 2

В качестве альтернативы вы можете использовать collection.breakOut как неявный аргумент CanBuildFrom для вызова map; это выберет построитель результатов на основе ожидаемого типа.

scala> val x: Map[Int, String] = (1 to 5).map(x => (x, "-" * x))(collection.breakOut)
x: Map[Int,String] = Map(5 -> -----, 1 -> -, 2 -> --, 3 -> ---, 4 -> ----)

Он будет работать лучше, чем версия .toMap, поскольку она только выполняет повторную сборку.

Это не так очевидно, но это также работает с пониманием.

scala> val x: Map[Int, String] = (for (i <- (1 to 5)) yield (i, "-" * i))(collection.breakOut)
x: Map[Int,String] = Map(5 -> -----, 1 -> -, 2 -> --, 3 -> ---, 4 -> ----)

Ответ 3

val map = foo zip (foo map f) toMap