Ответ 1
Используйте TraversableOnce.toMap
, который определяется, если элементы Traversable/Iterable имеют тип Tuple2
. (API)
val map = foo.map(x=>(x, f(x)).toMap
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
кортежа?
Используйте TraversableOnce.toMap
, который определяется, если элементы Traversable/Iterable имеют тип Tuple2
. (API)
val map = foo.map(x=>(x, f(x)).toMap
В качестве альтернативы вы можете использовать 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 -> ----)
val map = foo zip (foo map f) toMap