[英]how to make Scala canBuildFrom to build collection type from Seq to Set
I did experiment on CanBuildFrom trait on Scala, it looks fine when I try to convert Array type to Seq type automatically, I think the reason is that we have CanBuildFrom[Array, T, Seq[T]] in the scope. 我在Scala上尝试了CanBuildFrom trait,当我尝试自动将Array类型转换为Seq类型时看起来很好,我认为原因是我们在范围内有CanBuildFrom [Array,T,Seq [T]]。 However, if I try to convert Array to Set, it is not working. 但是,如果我尝试将Array转换为Set,则无法正常工作。 Further, Converting Seq to Set is not working as well. 此外,将Seq转换为Set也不起作用。 I just wonder should I define implicit into same type CanBuildFrom companion object to implement conversion ?. 我只是想知道我是否应该将相同类型的CanBuildFrom隐式定义为同伴对象来实现转换? If it is, why scala doesnt provide it by default, is reason Set is a function ? 如果是,为什么scala默认不提供它,原因是Set是一个函数?
Here is the code which for Array to Seq 这是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"))
If I want to convert to Array to Set or List, it is not working 如果我想转换为Array to Set或List,则无效
CanBuildFromSpec.transform[List](Array("123", "3")) //compilation error, cannot construct
CanBuildFromSpec.transform[Set](Array("123", "3")) //compilation error, cannot construct
There is no need to reinvent a wheel - Scala collections have to[C[_]]
method which allows conversion as you want it: 没有必要重新发明轮子 - 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)
BTW, CanBuildFrom
was introduced not for easy convertibility. 顺便说一句, CanBuildFrom
引入并非易于转换。 It was needed in order for operations like map()
or filter()
to preserve original collection types. 为了使map()
或filter()
操作保留原始集合类型,需要它。
Also Array
is converted to Seq
automatically not because of CanBuildFrom
(that would imply that array contents are copied into the new sequence, which can be pretty inefficient), but because there is an implicit conversion from arrays to their wrappers providing Seq
interface. 此外, Array
不会因为CanBuildFrom
自动转换为Seq
(这意味着数组内容被复制到新序列中,这可能效率很低),但是因为存在从数组到其包装器的隐式转换,提供Seq
接口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.