最通用的惰性收集特征
most generic lazy collection trait
在 Scala 中,最通用的 Collection trait
可能是 GenIterable
。什么是最通用的 trait
指定集合必须是 "lazy-list",如 Stream
?
集合是 Stream
本身,并且是 class。
事实上,Stream[A]
的 superclasses/traits 如下:
- AbstractSeq[A]:不需要懒惰
- LinearSeq[A]:不需要懒惰
- GenericTraversableTemplate[A, Stream]:不需要懒惰
- LinearSeqOptimized[A, Stream[A]]:不需要懒惰
- 可序列化:不需要懒惰
为了确保自制的可迭代集合的惰性,您可以使用以下特征:
trait GenLazyIterable[A, B <: GenLazyIterable[A, B]] {
val head: A // To implement
private var computedTail: Option[B] = None
protected def lazyTail: B // To implement
def tail: B = {
if(computedTail.nonEmpty) computedTail.get
else {
val t = lazyTail
computedTail = Some(t)
t
}
}
}
注意以下几点:
- 您目前无法在抽象 class 或特征中直接拥有抽象惰性值。
- AbstractSeq[A] 不能被继承,因为需要你给出
length
属性 显然你不能保证 GenLazyIterable
- 可以继承
IterableLike
以使用foreach
等方法
在 Scala 中,最通用的 Collection trait
可能是 GenIterable
。什么是最通用的 trait
指定集合必须是 "lazy-list",如 Stream
?
集合是 Stream
本身,并且是 class。
事实上,Stream[A]
的 superclasses/traits 如下:
- AbstractSeq[A]:不需要懒惰
- LinearSeq[A]:不需要懒惰
- GenericTraversableTemplate[A, Stream]:不需要懒惰
- LinearSeqOptimized[A, Stream[A]]:不需要懒惰
- 可序列化:不需要懒惰
为了确保自制的可迭代集合的惰性,您可以使用以下特征:
trait GenLazyIterable[A, B <: GenLazyIterable[A, B]] {
val head: A // To implement
private var computedTail: Option[B] = None
protected def lazyTail: B // To implement
def tail: B = {
if(computedTail.nonEmpty) computedTail.get
else {
val t = lazyTail
computedTail = Some(t)
t
}
}
}
注意以下几点:
- 您目前无法在抽象 class 或特征中直接拥有抽象惰性值。
- AbstractSeq[A] 不能被继承,因为需要你给出
length
属性 显然你不能保证GenLazyIterable
- 可以继承
IterableLike
以使用foreach
等方法