元组iterable的Scala映射
从其他集合构建元组iterable的Scala映射,scala,scala-collections,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 :_*) 为了得到我想要的,但那似乎很痛苦。有没有一种更漂亮的方法可以从元组的Iterable构建Map呢?使用TraversableOnce.toMap,如果可遍历/It
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
,如果可遍历/Iterable的元素属于Tuple2
类型,则定义该映射
或者,您可以使用
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 -> ----)
scala>valx:Map[Int,String]=(对于(i--,1->--,2->--,3->--,4->--)
谢谢这一点-虽然我不打算在其他人必须阅读的代码中使用它,而不粘贴大量关于CanBuildFrom
疯狂的解释的链接,但它对于我想将一个不可变范围转换为可变.Map
的情况非常有用,我之前接受的答案只是给了我一个e类型错误。或者,foo.mapValues(f).toMap
@missingfaktor是否将mapValues作为除Map以外的类的方法?@maynesa,不,但我想我当时还不太清楚!)
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 -> ----)
val map = foo zip (foo map f) toMap