Scala:seq.size vs 模式匹配

Man*_*oid 0 functional-programming if-statement scala pattern-matching

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

所以,要么我可以这样做:

if(mySeq.size() > 0) // do your stuff
Run Code Online (Sandbox Code Playgroud)

或者,我可以这样做:

mySeq match {
  case x :: _ => // do your stuff
}
Run Code Online (Sandbox Code Playgroud)

我应该更喜欢哪一个?

ess*_*sse 6

如果您的检查正好是大小 > 0 或不,我更喜欢

if (mySeq.nonEmpty) { .. }
Run Code Online (Sandbox Code Playgroud)

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


jwv*_*wvh 5

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

case x :: _ =>除非基础集合是 a ,否则将不起作用List,但您可以将其更改为case x +: _ =>以获得更普遍的覆盖范围。

mySeq.size如果底层集合类似于 aVector但它是 a 上的线性操作,则可能相当有效List

我的建议是使用mySeq.sizeIs > 0(Scala 2.13)。sizeIs被设计为一旦可以确定比较就终止,因此即使在 a 上,它也应该在仅遍历一个元素后List返回。true