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
比大小检查更直观。
我必须根据 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
比大小检查更直观。