大小和大小之间的区别是

时间:2019-07-16 22:02:14

标签: scala scala-collections scala-2.13

sizesizeIs之间的语义区别是什么?例如,

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

路易斯在comment中提到

  

...在2.13+上,人们可以使用sizeIs > 1,它比   size > 1作为第一个不会计算之前的所有大小   返回

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

阅读scaladoc

  

返回一个值类,其中包含用于比较对象大小的操作   该$ coll为测试值。这些操作是按术语实现的   的sizeCompare(Int)

我不清楚为什么sizeIs比普通size更有效率?

1 个答案:

答案 0 :(得分:5)

据我了解的变化。

这个想法是对于没有 O(1) (常量) size的集合。这样,sizeIs可以更有效,特别是与较小值(例如注释中的1) 进行比较时。

但是为什么?
很简单,因为sizeIs无需计算所有大小然后进行比较,而是返回一个对象,该对象在计算比较时可以提前返回。
例如,让我们检查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 sizeIs > 1将在得知列表至少包含一个元素和hasMore时返回。因此,节省了遍历其他两个元素以计算大小3并进行比较的成本。

请注意:如果集合的大小大于比较值,则性能将大致相同((由于每个周期的额外比较,可能会比size慢)。因此,我只建议将其用于与较小值的比较,或者在您认为这些值将小于集合的情况下。