【问题标题】:Scala SetBuffer斯卡拉集合缓冲区
【发布时间】:2021-02-10 20:15:46
【问题描述】:

我正在尝试将我的项目从 Scala 2.12 更新到 Scala 2.13。我看到 Scala 团队在集合方面做了很多改变。

我有一个在 Scala 2.12 中看起来像这样的 SetBuffer

object SetBuffer extends MutableSetFactory[SetBuffer] {
  override def empty[Elem] = new SetBuffer[Elem](Set.empty)

  def apply[Elem](initialSet: Iterable[Elem]): SetBuffer[Elem] =
    new SetBuffer[Elem](initialSet.toSet)

  override def newBuilder[Elem] = new SetBufferBuilder[Elem]()

  class SetBufferBuilder[Elem] extends mutable.GrowingBuilder[Elem, SetBuffer[Elem]](SetBuffer.empty) {
    override def result(): SetBuffer[Elem] =
      new SetBuffer[Elem](elems.getDelta)
  }
}

class SetBuffer[ElemType](initialSet: Set[ElemType])
  extends mutable.HashSet[ElemType]
    with mutable.SetLike[ElemType, SetBuffer[ElemType]]
    with GenericSetTemplate[ElemType, SetBuffer] {

  initialSet.map(+=)

  override def companion: SetBuffer.type = SetBuffer

  def getDeltaBuffer: SetBuffer[ElemType] = {
    SetBuffer[ElemType]((this -- initialSet).toSeq:_*)
  }

  def getDelta: immutable.Set[ElemType] = {
    val deltaElements = (this -- initialSet).toSeq
    immutable.Set[ElemType](deltaElements: _*)
  }

  def ++(that: Iterable[ElemType]): SetBuffer[ElemType] =
    SetBuffer(toIterable ++ that)

  def append(that: Iterable[ElemType]): Unit = this ++= that

  def ++=(that: Iterable[ElemType]): Unit = that.map(+=)
}

Scala 2.13 删除了 mutable.SetLike[ElemType, SetBuffer[ElemType]]GenericSetTemplate[ElemType, SetBuffer] 并使 mutable.HashSet 成为最终版本。有没有办法重写class SetBuffer[ElemType](initialSet: Set[ElemType]) 中的代码,使其行为相同并具有相同的性能?

【问题讨论】:

    标签: scala scala-collections


    【解决方案1】:

    我想到了两个想法。

    首先-您可以尝试使用似乎不是最终的https://www.scala-lang.org/api/current/scala/collection/mutable/LinkedHashSet.html。我不确定这是否可能,并且我没有搜索性能特征。

    其次,你选择组合而不是继承。包装 HashSet 的实例并将所有调用委托给它。不过,您必须实现相当多的接口才能实现相同的行为。

    【讨论】:

    • 实现 LinkedHashSet 就可以了,我比较了两种实现的基准,没有太大区别。唯一的缺点是 LinkedHashSet 的内存占用更大,但这并不困扰我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多