最通用的惰性收集特征

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等方法