scala - 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
?
解决方案
据我了解的变化。
这个想法是对于没有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
由于每个周期的额外比较而慢)。因此,我只建议将其用于与小值进行比较,或者当您认为这些值将小于集合时。
推荐阅读
- pdf - 使用 Netsuite SuiteScripts 2.0 中的高级 PDF 模板将打印按钮添加到供应商信用(查看模式)
- angular - Angular 2+ / Typescript 无法读取未定义的属性
- c++ - 当我尝试使用“this”指针时出现预期的表达式错误
- mysql - 如何授予用户权限以授予其他用户在mysql中的只读访问权限
- java - maven'实际参数和形式参数长度不同'的奇怪编译错误
- php - 如何在 PHP 中更改数组的键?
- spring-boot - 嵌入式服务器(微服务)是否等同于应用服务器(JbossEAP)?
- python - 对于给定的 Pandas df,按列对 df 进行排序(首先是最高的 SUMMED 值),然后在每个唯一值中按另一列排序
- gradle - 在使用 Gradle 5.4 的 multibuild 项目中,java 8 的 sourceSompatiblity 没有生效
- symfony - 如何在数据库中添加 JSON 字段?