在Scala中,可能最通用的Collection trait
是GenIterable
。什么是最通用的trait
,指定一个集合必须是一个"惰性列表",像Stream
?
集合是Stream
本身,它是一个类。实际上,Stream[A]
的父类/特征如下:
- AbstractSeq[A]: No lazy required
- LinearSeq[A]: No lazy required
- GenericTraversableTemplate[A, Stream]: No lazy required
- LinearSeqOptimized[A, Stream[A]]: No lazy required
- Serializable:不需要惰性
为了确保自制可迭代集合的惰性,你可以使用以下trait:
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
}
}
}
注意以下内容:
- 当前不能在抽象类或trait中直接使用抽象惰性值。seq [A]不能被继承,因为需要你给
length
属性,显然你不能保证在GenLazyIterable
- 您可以继承
IterableLike
以便使用foreach
等方法