从其他集合构建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
?
从其他集合构建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
?
使用 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 -> ----)
mutable.Map
的情况非常有用。之前我接受的答案只是给了我一个类型错误。 - themelval map = foo zip (foo map f) toMap
foo.mapValues(f).toMap
。 - missingfaktor