gpt4 book ai didi

scala - Scala 中的 Seq 和 IndexedSeq/LinearSeq 有什么区别?

转载 作者:行者123 更新时间:2023-12-04 02:47:33 26 4
gpt4 key购买 nike

Scala Collection documentation ,这个问题有一些线索:

Trait Seq has two subtraits LinearSeq, and IndexedSeq. These do not add any new operations, but each offers different performance characteristics: A linear sequence has efficient head and tail operations, whereas an indexed sequence has efficient apply, length, and (if mutable) update operations.



但这并没有说明何时使用 IndexedSeq而不是 Seq ?
我需要一些 IndexedSeq 的真实示例或 LinearSeq这些集合比 Seq 做得更好.

最佳答案

Seq是超特征,所以它更通用,它具有所有序列共有的特征,包括线性和索引。

如果您想知道 Seq.apply 创建了什么样的序列Seq 的伴生对象中的方法,我们可以看一下实现。

请记住 如果您使用 Seq.apply,则意味着您只需要一个 Seq,并且您的代码并不关心它是线性的还是索引的

tl;博士的答案是:你使用 LinearSeqIndexedSeq当你需要有一定的性能特征时,你使用更通用的Seq当你不在乎差异时

这是 Seq 的伴随对象:

object Seq extends SeqFactory[Seq] {
implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, Seq[A]] = ReusableCBF.asInstanceOf[GenericCanBuildFrom[A]]

def newBuilder[A]: Builder[A, Seq[A]] = immutable.Seq.newBuilder[A]
}
newBuilder[A]方法是用于构建 Seq 的方法,您可以在 Seq.apply 方法中验证(在特征 GenericCompanion 上定义):
def apply[A](elems: A*): CC[A] = {
if (elems.isEmpty) empty[A]
else {
val b = newBuilder[A]
b ++= elems
b.result()
}
}

现在的问题是: immutable.Seq.newBuilder[A] 是什么意思? build ?
我们去看看,这次是在 immutable.Seq伴生对象:
object Seq extends SeqFactory[Seq] {
// stuff
def newBuilder[A]: Builder[A, Seq[A]] = new mutable.ListBuffer
}

它构建了一个可变的 ListBuffer !这是为什么?那是因为 mutable.ListBuffer也恰好是 Builder[A, Seq[A]] ,即集合库用来构建新集合的类。

实际的输出集合来自这一行(如上所示):
b.result()

那么, ListBuffer.result() 的返回类型是什么? ?让我们在 ListBuffer 中看看:
// Implementation of abstract method in Builder
def result: List[A] = toList

给你:这是一个列表。
Seq(1,2,3)返回 List[Int]在引擎盖下,但是 这里的重点是,如果你使用 Seq(),你不需要知道你有什么样的集合,因为你暗示更抽象的接口(interface)足以满足你的需要

关于scala - Scala 中的 Seq 和 IndexedSeq/LinearSeq 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36091667/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com