Scala:seq.size 与模式匹配

Scala: seq.size vs pattern matching

我必须根据 Seq 的大小做出决定。

所以,我可以做:

if(mySeq.size() > 0) // do your stuff

或者,我可以这样做:

mySeq match {
  case x :: _ => // do your stuff
}

我更喜欢哪一个?

Seq 是底层集合类型的抽象。这带来了一些问题。

除非基础集合是 List,否则

case x :: _ => 将不起作用,但您可以将其更改为 case x +: _ => 以获得更广泛的覆盖范围。

如果底层集合类似于 Vector

mySeq.size 可能相当有效,但它是对 List.

的线性运算

我的建议是使用 mySeq.sizeIs > 0 (Scala 2.13)。 sizeIs 旨在确定比较后立即终止,因此即使在 List 上它也应该 return true 在仅遍历一个元素后。

如果您检查的尺寸是否 > 0,我更愿意

if (mySeq.nonEmpty) { .. }

这个解决方案没有性能损失,适用于所有版本的 Scala。在我看来 nonEmpty 比大小检查更直观。