加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么包装scala.collections.immutable中的VectorBuilder?

发布时间:2020-12-16 18:48:23 所属栏目:安全 来源:网络整理
导读:VectorBuilder在与Vector相同的源文件中定义. Vector是不可变的并且在 scala.collections.immutable包中,因此构建器位于同一个包中. 据我所知,如果未明确键入返回类型,CanBuildFrom将使用VectorBuilder作为默认值. 是否有理由不将构建器放在可变包中的单独文
VectorBuilder在与Vector相同的源文件中定义. Vector是不可变的并且在 scala.collections.immutable包中,因此构建器位于同一个包中.

据我所知,如果未明确键入返回类型,CanBuildFrom将使用VectorBuilder作为默认值.

>是否有理由不将构建器放在可变包中的单独文件中?
>建造者是不是要直接使用?如果是,那么使用哪个构建器或缓冲区来创建Seq?

解决方法

VectorBuilder不是直接使用的.如果你想获得Vector的构建器,你只需要调用Vector.newBuilder [T],它返回一个Builder [T,Vector [T]](底层实例是VectorBuilder).

因此,如果您想要用于创建Seq的默认构建器,您只需要调用Seq.newBuilder:

scala> Seq(1,2,3)
res0: Seq[Int] = List(1,3)

scala> Seq.newBuilder[Int]
res1: scala.collection.mutable.Builder[Int,Seq[Int]] = ListBuffer()

scala> Seq.newBuilder[Int].result
res2: Seq[Int] = List()

上面显示了Seq的默认实现是list,从逻辑上讲,Seq的默认构建器实际上是一个mutable.ListBuffer.

ListBuffer不仅仅是一个List构建器,这就是它在collection.mutable中的原因,而VectorBuilder不是Buffer,它不能用于构建Vector之外的任何其他东西.这可能是它在Vector中本地定义的原因.我不确定为什么它不是私有的,我无法在Vector本身的公共API中看到它被引用.也许它应该是(私人的).

仅供参考,CanBuildFrom没有隐藏的魔法,它几乎总是通过上面的newBuilder:

>当你没有指定预期的集合类型时,如Seq(1,2).map(_ 1),唯一可用的CanBuildFrom comes from伴随对象是Seq,并且类型为CanBuildFrom [Seq [_],T,SEQ [T]].这意味着结果也将是Seq.
>与集合的大多数伴随对象一样,CanBuildFrom实例Seq只提供一件事:调用Seq.newBuilder(在GenTraversableFactory中定义…)

这就是为什么CanBuildFrom for Vector使用VectorBuilder的原因.例如,在这:

scala> Vector(1,3).map(_+1)
res12: scala.collection.immutable.Vector[Int] = Vector(2,3,4)

使用的构建器是:

scala> implicitly[CanBuildFrom[Vector[Int],Int,Vector[Int]]].apply()
res13: scala.collection.mutable.Builder[Int,Vector[Int]] = 
  scala.collection.immutable.VectorBuilder@43efdf93

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读