从其他馆藏中构建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
?
答案 0 :(得分:30)
如果Traversable / Iterable的元素属于TraversableOnce.toMap
类型,则使用Tuple2
。 (API)
val map = foo.map(x=>(x, f(x)).toMap
答案 1 :(得分:4)
或者,您可以使用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 -> ----)
答案 2 :(得分:2)
val map = foo zip (foo map f) toMap