size 和 sizeIs 的区别

Difference between size and sizeIs

size and sizeIs之间的语义区别是什么?例如,

List(1,2,3).sizeIs > 1 // true
List(1,2,3).size > 1   // true

Luis 在 comment 中提到

...on 2.13+ one can use sizeIs > 1 which will be more efficient than size > 1 as the first one does not compute all the size before returning

Add size comparison methods to IterableOps #6950 似乎是引入它的 pull request。

正在阅读 scaladoc

Returns a value class containing operations for comparing the size of this $coll to a test value. These operations are implemented in terms of sizeCompare(Int)

我不清楚为什么 sizeIs 比常规 size 更有效?

据我了解变化。

这个想法是,对于没有 O(1) (常量) size 的集合。然后,sizeIs可以更高效,专门用于比较小值(如评论中的1)

但是为什么呢?
很简单,因为不是计算所有大小然后进行比较,sizeIs return 是一个对象,在计算比较时,可以 return 早。
例如,让我们检查 code

def sizeCompare(otherSize: Int): Int = {
  if (otherSize < 0) 1
  else {
    val known = knownSize
    if (known >= 0) Integer.compare(known, otherSize)
    else {
      var i = 0
      val it = iterator
      while (it.hasNext) {
        if (i == otherSize) return if (it.hasNext) 1 else 0 // HERE!!! - return as fast as possible.
        it.next()
        i += 1
      }
      i - otherSize
    }
  }
}

因此,在评论的例子中,假设一个非常非常非常长的三个元素的List。一旦知道 List 至少有一个元素和 hasMoresizeIs > 1 就会 return。这样就节省了遍历另外两个元素计算大小为3再进行比较的开销。

请注意:如果集合的大小大于比较值,则性能将大致相同 (可能比 size 慢,因为对每个集合进行了额外的比较周期)。因此,我只建议将此用于与小值的比较,或者当您认为值将小于集合时。