Scala Map来自元组可迭代

时间:2011-06-29 14:36:09

标签: scala scala-collections

从其他馆藏中构建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

3 个答案:

答案 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