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
更有效率?
答案 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
慢)。因此,我只建议将其用于与较小值的比较,或者在您认为这些值将小于集合的情况下。