【问题标题】:Scala: seq.size vs pattern matchingScala:seq.size 与模式匹配
【发布时间】:2020-06-26 14:54:00
【问题描述】:
我必须根据 Seq 的大小做出决定。
所以,我可以做到:
if(mySeq.size() > 0) // do your stuff
或者,我可以这样做:
mySeq match {
case x :: _ => // do your stuff
}
我应该更喜欢哪一个?
【问题讨论】:
标签:
scala
if-statement
functional-programming
pattern-matching
【解决方案1】:
Seq 是底层集合类型的抽象。这带来了一些问题。
除非基础集合是List,否则case x :: _ => 将不起作用,但您可以将其更改为case x +: _ => 以获得更普遍的覆盖范围。
如果底层集合类似于Vector,mySeq.size 可能相当有效,但它是List 上的线性运算。
我的建议是使用mySeq.sizeIs > 0 (Scala 2.13)。 sizeIs 旨在在确定比较后立即终止,因此即使在 List 上,它也应该在仅遍历一个元素后返回 true。
【解决方案2】:
如果您的检查是否正好是大小 > 0,我更喜欢
if (mySeq.nonEmpty) { .. }
此解决方案不会降低性能,适用于所有版本的 scala。在我看来nonEmpty 比尺寸检查更直观。