Scala Map来自元组可迭代

the*_*mel 21 scala scala-collections

scala.collection.Map从其他馆藏构建,我经常发现自己写作:

val map = Map(foo.map(x=>(x, f(x)))
Run Code Online (Sandbox Code Playgroud)

但是,由于Map.apply只接受变量参数,因此这不起作用- 所以我必须写:

val map = Map(foo.map(x=>(x, f(x)) toSeq :_*)
Run Code Online (Sandbox Code Playgroud)

得到我想要的东西,但这看起来很痛苦.有没有比MapIterable元组构造一个更漂亮的方法?

Deb*_*ski 31

TraversableOnce.toMap如果Traversable/Iterable的元素属于类型,则定义使用Tuple2.(API)

val map = foo.map(x=>(x, f(x)).toMap
Run Code Online (Sandbox Code Playgroud)


ret*_*nym 5

另外,您可以将use 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 -> ----)
Run Code Online (Sandbox Code Playgroud)

它会比.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 -> ----)
Run Code Online (Sandbox Code Playgroud)