最通用的惰性收集特性



在Scala中,可能最通用的Collection traitGenIterable。什么是最通用的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等方法

相关内容

  • 没有找到相关文章

最新更新