繁体   English   中英

如何使Scala canBuildFrom构建从Seq到Set的集合类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM