Scala 设置缓冲区
Scala SetBuffer
我正在尝试将我的项目从 Scala 2.12 更新到 Scala 2.13。看到Scala团队在collection端做了很多改动
我有一个在 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])
中的代码,使其行为相同并具有相同的性能?
我想到了两个想法。
首先 - 您可以尝试使用似乎不是最终版本的 https://www.scala-lang.org/api/current/scala/collection/mutable/LinkedHashSet.html。我不确定是否可行,我没有搜索性能特征。
其次,你追求组合而不是继承。包装 HashSet 的实例并将所有调用委托给它。不过,您必须实现相当多的接口才能实现相同的行为。
我正在尝试将我的项目从 Scala 2.12 更新到 Scala 2.13。看到Scala团队在collection端做了很多改动
我有一个在 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])
中的代码,使其行为相同并具有相同的性能?
我想到了两个想法。
首先 - 您可以尝试使用似乎不是最终版本的 https://www.scala-lang.org/api/current/scala/collection/mutable/LinkedHashSet.html。我不确定是否可行,我没有搜索性能特征。
其次,你追求组合而不是继承。包装 HashSet 的实例并将所有调用委托给它。不过,您必须实现相当多的接口才能实现相同的行为。