[英]how to make Scala canBuildFrom to build collection type from Seq to Set
我在Scala上尝试了CanBuildFrom trait,当我尝试自动将Array类型转换为Seq类型时看起来很好,我认为原因是我们在范围内有CanBuildFrom [Array,T,Seq [T]]。 但是,如果我尝试将Array转换为Set,则无法正常工作。 此外,将Seq转换为Set也不起作用。 我只是想知道我是否应该将相同类型的CanBuildFrom隐式定义为同伴对象来实现转换? 如果是,为什么scala默认不提供它,原因是Set是一个函数?
这是Array到Seq的代码
def transform[U[_]](col: Array[String])(implicit cbf: CanBuildFrom[Array[String], String, U[String]]): U[String] = {
val builder = cbf()
for (ele <- col) builder += ele
builder.result()
}
CanBuildFromSpec.transform[Seq](Array("123", "3"))
如果我想转换为Array to Set或List,则无效
CanBuildFromSpec.transform[List](Array("123", "3")) //compilation error, cannot construct
CanBuildFromSpec.transform[Set](Array("123", "3")) //compilation error, cannot construct
没有必要重新发明轮子 - Scala集合必须to[C[_]]
方法允许你想要的转换:
scala> List(1, 2, 3).to[Vector]
res0: Vector[Int] = Vector(1, 2, 3)
scala> Array(1, 2, 3).to[Seq]
res1: Seq[Int] = Vector(1, 2, 3)
scala> Seq(1, 2, 3).to[Set]
res2: Set[Int] = Set(1, 2, 3)
顺便说一句, CanBuildFrom
引入并非易于转换。 为了使map()
或filter()
操作保留原始集合类型,需要它。
此外, Array
不会因为CanBuildFrom
自动转换为Seq
(这意味着数组内容被复制到新序列中,这可能效率很低),但是因为存在从数组到其包装器的隐式转换,提供Seq
接口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.