scala - 是否可以像旧的 CanBuildFrom 那样隐式获取集合的构建器?
问题描述
我有一些旧代码依赖于隐式CanBuildFrom
来构建指定为类型参数的类型的集合。从 2.12 开始,在新的集合库中,替换BuildFrom
不提供无参数Builder
工厂方法。我想要的是IterableFactory
集合,但这些是伴随对象,它们不是隐式的。我可以以某种方式移植它而不引入我自己的隐式工厂类Factory
,为库中的每个集合类包装一个吗?我知道那些工厂有很多口味,但即使我必须为那些接受隐含证据的人添加一个特例,它仍然比我拥有的要好得多。
新代码中一个明智的选择可能是将IterableFactory
作为(值)参数而不是依赖于显式类型参数,但这需要在太多地方进行更改,所以我宁愿坚持当前架构并做样板.
解决方案
如果您想使用 a 和没有先前现有的集合逐个元素地构建通用集合Builder
,则可以使用隐式Factory
参数。例如:
import scala.collection.Factory
class Filler[T](makeElement: Int => T) {
def apply[C[_]](n: Int)(implicit factory: Factory[T, C[T]]): C[T] = {
val builder = factory.newBuilder
for (i <- 1 to n) builder += makeElement(i)
builder.result()
}
}
你可以像这样使用它:
scala> val fill = new Filler(_.toString)
fill: Filler[String] = Filler@154f8280
scala> fill[Vector](10)
res0: Vector[String] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> fill[Set](10)
res1: Set[String] = HashSet(8, 4, 9, 5, 10, 2, 7, 3, 6, 1)
scala> fill[Array](10).toSeq
res2: Seq[String] = ArraySeq(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Factory
标准库中为String
s 和Array
s 提供了单独的隐式s。并且对于所有Iterable
s ( List
, Map
, Set
, 等) 它都有效,因为Iterable
s 的伴随对象扩展了IterableFactory
提供implicit def iterableFactory[A]: Factory[A, CC[A]]
方法的类。
推荐阅读
- hadoop - 使用 hadoop 3.2.1 和 Yarn 执行作业时出错
- google-chrome-extension - 如何从本地存储中获取密钥的值,该密钥存储在浏览器中的 Chrome 扩展程序中
- java - Maven:WSDLException:无法找到请求目标的有效认证路径(即使我安装了 jssecacerts 以确保安全)
- python - 从 np.array 中删除 dtype
- python - 将 json 列读入新列 pandas
- json - 有没有办法同时运行 Flask 服务器并存储来自消息代理的传入数据?
- jquery - 如果窗口大小发生变化,撤消 jQuery 函数
- android - 使用自定义 recyclerview 适配器文件的 progressDialog 和 Toast 错误
- python - 字典 values() 方法只显示几个值
- sql-server - SQL Server 中的大整数键