首页 > 解决方案 > size 和 sizeIs 的区别

问题描述

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

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

路易斯在评论中提到

...在 2.13+ 上,可以使用sizeIs > 1这将比 size > 1第一个在返回之前不计算所有大小更有效

向 IterableOps #6950 添加大小比较方法似乎是引入它的拉取请求。

阅读 scaladoc

返回一个值类,其中包含用于将此 $coll 的大小与测试值进行比较的操作。这些操作是在以下方面实施的sizeCompare(Int)

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

标签: scalascala-collectionsscala-2.13

解决方案


据我了解的变化。

这个想法是对于没有O(1) (constant) size的集合。然后,sizeIs可以更有效,特别是与小值的比较(如评论中的 1 )

但为什么?
简单,因为不是计算所有大小然后进行比较,而是sizeIs返回一个对象,该对象在计算比较时可以提前返回。
例如,让我们检查代码

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
    }
  }
}

因此,在评论的例子中,假设一个非常非常长的三个元素的列表sizeIs > 1一旦知道List至少有一个元素和. 就会返回hasMore。因此,节省了遍历其他两个元素以计算大小为 3 然后进行比较的成本。

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


推荐阅读