gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:38:52 26 4
gpt4 key购买 nike

我在 Scala 上对 CanBuildFrom 特征进行了实验,当我尝试自动将 Array 类型转换为 Seq 类型时,它看起来很好,我认为原因是我们在范围内有 CanBuildFrom[Array, T, Seq[T]] 。但是,如果我尝试将数组转换为集合,它就不起作用。此外,将 Seq 转换为 Set 也不起作用。我只是想知道我是否应该将隐式定义为相同类型的 CanBuildFrom 伴随对象来实现转换?如果是,为什么 scala 默认不提供它,是因为 Set 是一个函数吗?

这是数组到 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"))

如果我想将数组转换为 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 会自动转换为 Seq,而不是因为 CanBuildFrom(这意味着数组内容被复制到新序列中,这可能效率很低),但因为存在从数组到提供 Seq 接口(interface)的包装器的隐式转换。

关于scala - 如何使Scala canBuildFrom构建从Seq到Set的集合类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23947186/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com