Ral*_*lph 5 collections scala type-conversion
我试图使用Scala 2.10中的新方法将scala.collection.immutable.List一对对转换为a ,但是我得到一个编译时错误:scala.collection.immutable.SortedMapto
scala> List((1, "Fred"), (2, "Barney")).to[scala.collection.immutable.SortedMap]
<console>:10: error: scala.collection.immutable.SortedMap takes two type parameters, expected: one
List((1, "Fred"), (2, "Barney")).to[SortedMap]
^
Run Code Online (Sandbox Code Playgroud)
可以使用该to方法完成吗?我错过了中间方法调用吗?
我前一段时间遇到过类似的问题并提出了这个问题:
SortedMap( list: _*)
Run Code Online (Sandbox Code Playgroud)
所以你可以这样做:
val map = SortedMap( List((1, "Fred"), (2, "Barney")): _*)
Run Code Online (Sandbox Code Playgroud)
这_*意味着您将Seqs元素而不是Seq自身作为参数.
@gourlaysama已经解释了为什么它不能编译,@ Chirlo提供了最简单(和推荐)的工作:SortedMap( list: _*).
我想提出一个替代方案:
import collection.Traversable
import collection.generic.CanBuildFrom
implicit class RichPairTraversable[A,B]( t: Traversable[(A,B)] ) {
def toPairCol[Col[A,B]](implicit cbf: CanBuildFrom[Nothing, (A,B), Col[A, B]]): Col[A, B] = {
val b = cbf()
b.sizeHint(t)
b ++= t
b.result
}
}
Run Code Online (Sandbox Code Playgroud)
在REPL中进行一些测试:
scala> List((1, "Fred"), (2, "Barney")).toPairCol[scala.collection.immutable.SortedMap]
res0: scala.collection.immutable.SortedMap[Int,String] = Map(1 -> Fred, 2 -> Barney)
scala> List((1, "Fred"), (2, "Barney")).toPairCol[scala.collection.immutable.HashMap]
res1: scala.collection.immutable.HashMap[Int,String] = Map(1 -> Fred, 2 -> Barney)
Run Code Online (Sandbox Code Playgroud)
现在,我可能不会在生产中使用它,因为做起来SortedMap( list: _* )并不那么难,并且不需要魔法.
| 归档时间: |
|
| 查看次数: |
2168 次 |
| 最近记录: |