Scala元组可迭代的Map

23

从其他集合构建scala.collection.Map时,我经常会写下以下代码:

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

然而,这并不起作用,因为Map.apply仅接受可变参数 - 所以我必须编写:

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

我想得到我想要的东西,但那看起来很麻烦。是否有更漂亮的方法可以从元组的Iterable构建一个Map

3个回答

34

使用 TraversableOnce.toMap,如果一个 Traversable/Iterable 的元素的类型是 Tuple2,则该方法已被定义。 (API)

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

1
或者,foo.mapValues(f).toMap - missingfaktor
@missingfaktor mapValues方法适用于除Map之外的类吗? - juanchito
@mayonesa,不,但我猜当时我不知道更好的选择! :) - missingfaktor

5

或者你可以使用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版本更好,因为它只对集合进行一次迭代。
这也可以使用for-comprehension实现,虽然并不明显。
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 -> ----)

谢谢您提供这个代码片段。虽然我不会在其他人需要阅读的代码中使用它,但对于我想将不可变范围转换为mutable.Map的情况非常有用。之前我接受的答案只是给了我一个类型错误。 - themel

2
val map = foo zip (foo map f) toMap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接