缓存长度为

时间:2016-01-17 13:06:17

标签: list scala collections

对于某些算法,我一遍又一遍地操作同一个列表(或其后缀),我正在访问length。但是,除此之外,我只访问headtail,因此我不需要随机访问。优化访问长度的最佳方法是什么?

length是否已在内部缓存(可能是lazy val?)?我应该在List周围写一个包装器吗?我可以用特质做到这一点,这是一个很好的解决方案吗?我应该使用另一个集合类,例如Vector吗?

1 个答案:

答案 0 :(得分:1)

对于ListlengthsizeTraversableOnceLinearSeqOptimized中定义,它们由可变集合共享,因此无法缓存它们。如果您搜索val lengthval size的标准库来源,则不会显示任何集合类成员。

您不能将List子类化,因为它是sealed,但如果您愿意,可以将其包装。需要做更多工作才能允许map等等,同时保留大小。

case class WrappedList[A](list: List[A]) {
    lazy val length = list.length
}

Vector似乎是一个不错的选择。 length不是严格缓存,但定义为:

def length = endIndex - startIndex

endIndexstartIndex是私有构造函数val,使其比List#length快得多。如果没有看到有问题的算法,就很难就使用哪种集合类型提出进一步的建议。