Scala - Seq的size和length有什么区别?

80

Seq的尺寸和长度之间有什么区别?何时使用其中之一?

scala> var a :Seq[String] = Seq("one", "two")
a: Seq[String] = List(one, two)

scala> a.size
res6: Int = 2

scala> a.length
res7: Int = 2

一样吗?

谢谢


正如您可能在Scaladoc中看到的那样,它们是相同的。 - om-nom-nom
5个回答

84

没有什么。在Seq文档中,在size方法中明确说明:“这个序列的大小,等同于length。”。


1
我猜我是唯一在意的人,但为什么呢? - ecoe
也许一些旧库使用了 size,其他的使用了 length,因此他们保留了两者,以免麻烦需要更改其中之一?这只是一个猜测。 - Peter

75

GenTraversableOnce中定义了size,而在GenSeqLike中定义了length,因此length仅适用于Seq,而size适用于所有Traversable。 然而,正如先前指出的那样,对于Seqsize只是委托给length(这可能意味着,在内联之后,您将获得相同的字节码)。


14

Seq(序列)中它们是相同的,正如其他人所提到的。然而,以下是IntelliJ在scala.Array上警告的信息:

将数组和字符串中的.size替换为.length

检查信息:此检查报告了对array.size和string.size的调用。虽然这样的调用是合法的,但它们需要进行额外的隐式转换才能变成SeqLike。一个常见的用例是在数组和字符串上调用length可能会带来显著的优势。


10

这句话的意思是,一个方法将任务委托给了另一个方法。详见SeqLike trait。

  /** The size of this $coll, equivalent to `length`.
   *
   *  $willNotTerminateInf
   */
  override def size = length

7
我做了一个实验,使用Scala 2.12.8版本和百万条目列表。在第一次使用时,length()的速度比size()快7或8倍。但在同一列表上进行第二次尝试后,size()的速度与length()大致相同。
然而,经过一段时间后,可能是缓存已经清空,此时size()再次变得慢7或8倍。
这表明,在序列中更喜欢使用length()。它不仅仅是size()的另一个名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接